Вы можете добавлять i--;
и len--;
каждый раз, когда используете соединение:
let a = [0, 1, 2, 0, 0, 3, 0];
let count = 0;
let len = a.length;
for (i = 0; i < len; i++) {
if (a[i] == 0) {
count = count + 1;
a.splice(i, 1);
i--; len--;
}
}
for (j = 0; j < count; j++) {
a.push(0);
}
console.log(a);
Это потому, что когда вы соединяете 1 элемент, ключи массива смещаются вниз на один, поэтому ключ следующего элемента, который вы хотите проверить, совпадает с ключом, который вы только что удалили. Значение len также корректируется с помощью len--;
, потому что мы только что удалили элемент.
Хотя этот ответ является правильным способом сделать это с использованием вашего первоначального плана, это своего рода исправление. Ваша проблема заключалась в том, что вы зацикливаетесь на массиве, и этот массив теряет элементы во время цикла, и, как правило, правильный подход в этих ситуациях заключается в зацикливании в обратном направлении. Таким образом, элементы, которые рискуют изменить свой ключ во время цикла, являются элементами, которые мы уже проверили.