我知道我的'算法'根本没用,但我想我遇到了一个非常奇怪的行为。
findMatching([ “笑话”, “jokeg”], “笑话”);回答笑话。但是findMatching([“jokes”,“jokeg”,“jokef”],“笑话”);返回笑话和笑话!当我单独测试jokef时它不匹配。
这是我的代码:
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;
}
答案 0 :(得分:2)
Array.splice()是一种破坏性操作,可以改变数组的长度。如果您将console.log语句添加到中间 for 循环,则可以清楚地看到这一点:
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
它永远不会到达“jokef”中的'f',因为它拼接了数组。 matching.length 现在是 2 ,而 for 条件(var k = 0; k&lt; matching.length; k ++)现在是 false ,导致循环中断,JavaScript引擎移动到下一个块。