2011-08-13 15 views
0

私の「アルゴリズム」は全く役に立たないと知っていますが、私は非常に奇妙な動作に遭遇したと思います。文字列マッチングアルゴリズムで奇妙な動作がある

findMatching(["jokes"、 "jokeg"]、 "jokes");ジョークを返します。しかし、findMatching(["ジョーク"、 "ジョーク"、 "ジョーク"]、 "ジョーク");ジョークとジョークを返します!ジョークを個別にテストすると、マッチしません。ここ

は私のコードである:

 for (var p in dataArray) { 
      if (dataArray[p].length != matching.length) { 
       dataArray.splice(p,1); 
      } 
     } 
     for (var k = 0; k < matching.length; k++) { 
      for (var i in dataArray) { 
       if (dataArray[i].split('')[k] != matching.split('')[k]) { 
        dataArray.splice(i,1); 
       } 
      } 
     } 
     if(dataArray.length == 0){ 
      return null; 
     } else { 
      return dataArray; 
     } 

答えて

2

Array.splice()配列の長さを変更する破壊的な操作です。

for (var k = 0; k < matching.length; k++) { 
    for (var i in dataArray) { 
     console.log(dataArray, i, k, dataArray[i].split('')[k], matching.split('')[k]); 
     if (dataArray[i].split('')[k] != matching.split('')[k]) { 
      dataArray.splice(i,1); 
     } 
    } 
} 

出力は次のようになります:

["jokes", "jokeg", "jokef"] 0 0 j j 
["jokes", "jokeg", "jokef"] 1 0 j j 
["jokes", "jokeg", "jokef"] 2 0 j j 
["jokes", "jokeg", "jokef"] 0 1 o o 
["jokes", "jokeg", "jokef"] 1 1 o o 
["jokes", "jokeg", "jokef"] 2 1 o o 
["jokes", "jokeg", "jokef"] 0 2 k k 
["jokes", "jokeg", "jokef"] 1 2 k k 
["jokes", "jokeg", "jokef"] 2 2 k k 
["jokes", "jokeg", "jokef"] 0 3 e e 
["jokes", "jokeg", "jokef"] 1 3 e e 
["jokes", "jokeg", "jokef"] 2 3 e e 
["jokes", "jokeg", "jokef"] 0 4 s s 
["jokes", "jokeg", "jokef"] 1 4 g s 

をそれは「Fになることはありませんループのために、あなたのミドルにはconsole.logステートメントを追加する場合、これは明らかに見ることができます'それは配列をスプライスしたので、 "jokef"で。 matching.length現在、あり、ための条件は、(VARのK = 0; < matching.length k個あり、k ++)ループが破損する原因と、今であり、JavaScriptエンジンが次に移動しますブロック。