Странное поведение в алгоритме сопоставления строк - PullRequest
0 голосов
/ 13 августа 2011

Я знаю, что мой «алгоритм» вообще не полезен, но я думаю, что столкнулся с очень странным поведением.

findMatching (["jokes", "jokeg"], "jokes");возвращает шутки.Но findMatching (["шутки", "шутки", "шутки"], "шутки");возвращает анекдоты и шутки!Когда я тестирую 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 Ответ

2 голосов
/ 13 августа 2011

Array.splice () - это деструктивная операция, которая изменяет длину массива. Это хорошо видно, если вы добавите оператор console.log в ваш средний для цикла:

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' в "jokef", потому что он склеивает массив. match.length теперь 2 , а условие для (var k = 0; k false , что приводит к разрыву цикла и движку JavaScript для перехода к следующему блоку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...