Смешная ошибка в JavaScript: приходится несколько раз вызывать функцию для правильного поведения - PullRequest
2 голосов
/ 21 ноября 2010

У меня нет никаких сомнений, что мой собственный идиотизм ответственен за это. Я не программист, но ученый, и я просто взломаю что-нибудь, пока это не сработает, и я получаю такие странные ошибки. В принципе, любая помощь будет очень признательна.

Хорошо, моя функция такова:

function discardDuplicates(threshold) {
    for (var m = 0; m < xCo2.length; m++){
        var testX = xCo2[m];
        var testY = yCo2[m];
        for (var n = 0; n < xCo2.length; n++){
            if (m != n) {
                if ((Math.abs(xCo2[n] - testX) < threshold)
                    && (Math.abs(yCo2[n] - testY) < threshold)
                    && deltas[m] > deltas[n]){

                    xCo2.splice(n,1);
                    yCo2.splice(n,1);
                    deltas.splice(n,1);
                }
            }
        }
    }
}

Я обнаруживаю объекты с координатами (x, y), хранящимися в массивах xCo2 и yCo2, каждая координата также имеет свойство, известное как «дельта». И я хочу проверить, идентифицировал ли я несколько функций в основном в одном и том же месте - если они есть, они, вероятно, дубликаты, поэтому я удаляю из списка все, кроме одной с самой высокой дельтой.

Да, в принципе, это не работает!

На данный момент я должен сделать это:

//ugly hack 
var oldLength = 0;
var newLength = 1;
while (oldLength != newLength) {
    oldLength = xCo2.length;
    discardDuplicates(10);
    newLength = xCo2.length;
}

Потому что при первом вызове функции она не удаляет дубликаты. Во второй раз он удаляет большинство из них. В третий раз у них обычно их все ... Так что я просто продолжаю звонить до тех пор, пока они не перестанут удалять дубликаты. Функция определенно работает, хотя; это удаляет правильные точки.

Причина, по которой я задаю этот вопрос, состоит в том, что та же самая ошибка теперь произошла во второй раз со второй функцией, которая на этот раз пытается удалить любые координаты с дельта-значением, которое является слишком низким.

Просветление будет с благодарностью принято!

1 Ответ

10 голосов
/ 21 ноября 2010

Вызов splice в массиве удалит запись и переместит следующую запись в эту позицию, это очень распространенная ошибка.

Давайте посмотрим:

xCo2 = [1, 2, 3, 4, 5];
n = 0;

xCo2.splice(n, 1); // n = 0, removed 1
>> [2, 3, 4, 5];
n ++;

xCo2.splice(n, 1); // n = 1, removed 3
>> [2, 4, 5];
n++;

См.проблема?Вы пропускаете записи, вам нужно уменьшить n каждый раз, когда вы удаляете записи из массивов.Поскольку вы всегда удаляете 1 запись, вам нужно уменьшить n на один раз после объединения массивов.

if ((Math.abs(xCo2[n] - testX) < threshold)
     && (Math.abs(yCo2[n] - testY) < threshold) && deltas[m] > deltas[n] ){

    xCo2.splice(n,1);
    yCo2.splice(n,1);
    deltas.splice(n,1);
    n--;
}

PS: некоторые пробелы значительно увеличивают читабельность вашего кода.

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