字符串匹配算法中的奇怪行为

时间:2011-08-13 05:50:55

标签: string flash actionscript-3

我知道我的'算法'根本没用,但我想我遇到了一个非常奇怪的行为。

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;
        }

1 个答案:

答案 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引擎移动到下一个块。