Почему в for неправильная итерация массива
Нашел задачу в которой дается массив и нужно удалить все четные числа методом for
var a = [1, 2, 2, 2, 2, 3, 4]; for (var i = 0; i < a.length; i++) { if ((a[i] % 2) == 0) { a.splice(i, 1); } } alert(a); // [1, 2, 2, 3] почему в for неправильная итерация массива не могу понять |
Цитата:
|
Ты ошибаешься в for все нормально просто ты изменяешь массив т.е. удаляешь из него элементы.
<iframe width="360" height="215" src="https://www.youtube.com/embed/9P1YCLhpvpc" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe> |
for корректно работает.
Когда вы удаляете элемент из массива, то его длинна (и кол-во итераций цикла) уменьшаются, при этом счетчик (i) уже указывает на следующий после удаленного элемент массива, из-за этого такой результат. Для решения проблемы можно воспользоваться методом filter массивов либо в цикле заполнить новый массив необходимыми значениями, а после цикла старый заменить новым. Пример с методом "filter": var a = [1, 2, 2, 2, 2, 3, 4].filter(val=>val%2!=0); alert(a); // [1, 3] |
Ты удаляешь элементы из массива а[], а потом обращаешься к элементу например с индексом 5 а[5] а его уже нет в этом массиве(там осталось только 5 элементов , то есть последний элемент это a[4])
|
Nexus,
достаточно проверить последний разряд числа - у нечетных чисел он равен 1. alert([1, 2, 2, 2, 2, 3, 4].filter(n=>n & 1)) |
laimas, если бы я такой код в кач-ве примера выкатил, то от кода тс остался бы только сам массив )
Но все равно спасибо, не знал об этом. |
Цитата:
|
laimas,
Цитата:
Правильнее сказать, что я не догадывался, что так можно проверить четность числа. Побитовыми операциями вроде вообще никогда не пользовался, вероятно из-за этого и не догадался бы никогда, что можно использовать побитовое И. |
Цитата:
|
спасибо за помощь, разобрался
|
по сабжу и в целом:
1) поразрядные операции в js не настолько быстрые, как, например, в с++, потому что js-ное "число непойми какого типа" сначала приводится к integer, потом делается поразрядное действие. 2) как уже говорил, цикл+splice очень неэффективный вариант, дает сложность O(N^2) вот линейный вариант: https://javascript.ru/forum/misc/685...tml#post450880 |
ermak20,
var a = [1, 2, 2, 2, 2, 3, 4]; for (var i = 0; i < a.length; ) { if ((a[i] % 2) == 0) { a.splice(i, 1); } else i++ } alert(a); |
Часовой пояс GMT +3, время: 20:23. |