Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.03.2018, 12:06
Новичок на форуме
Отправить личное сообщение для ermak20 Посмотреть профиль Найти все сообщения от ermak20
 
Регистрация: 26.12.2016
Сообщений: 6

Почему в 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 неправильная итерация массива не могу понять

Последний раз редактировалось ermak20, 14.03.2018 в 12:13.
Ответить с цитированием
  #2 (permalink)  
Старый 14.03.2018, 12:21
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от ermak20
почему в for неправильная итерация массива
С итерацией все в порядке, просто вы модифицируете массив.
Ответить с цитированием
  #3 (permalink)  
Старый 14.03.2018, 12:22
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Ты ошибаешься в for все нормально просто ты изменяешь массив т.е. удаляешь из него элементы.

<iframe width="360" height="215" src="https://www.youtube.com/embed/9P1YCLhpvpc" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>
Ответить с цитированием
  #4 (permalink)  
Старый 14.03.2018, 12:25
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

for корректно работает.
Когда вы удаляете элемент из массива, то его длинна (и кол-во итераций цикла) уменьшаются, при этом счетчик (i) уже указывает на следующий после удаленного элемент массива, из-за этого такой результат.
Для решения проблемы можно воспользоваться методом filter массивов либо в цикле заполнить новый массив необходимыми значениями, а после цикла старый заменить новым.

Пример с методом "filter":
var a = [1, 2, 2, 2, 2, 3, 4].filter(val=>val%2!=0);
alert(a);   // [1, 3]
Ответить с цитированием
  #5 (permalink)  
Старый 14.03.2018, 12:27
Интересующийся
Отправить личное сообщение для Noga_programmista Посмотреть профиль Найти все сообщения от Noga_programmista
 
Регистрация: 13.03.2018
Сообщений: 17

Ты удаляешь элементы из массива а[], а потом обращаешься к элементу например с индексом 5 а[5] а его уже нет в этом массиве(там осталось только 5 элементов , то есть последний элемент это a[4])
Ответить с цитированием
  #6 (permalink)  
Старый 14.03.2018, 12:31
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Nexus,
достаточно проверить последний разряд числа - у нечетных чисел он равен 1.

alert([1, 2, 2, 2, 2, 3, 4].filter(n=>n & 1))
Ответить с цитированием
  #7 (permalink)  
Старый 14.03.2018, 12:34
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

laimas, если бы я такой код в кач-ве примера выкатил, то от кода тс остался бы только сам массив )

Но все равно спасибо, не знал об этом.
Ответить с цитированием
  #8 (permalink)  
Старый 14.03.2018, 12:36
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Nexus
не знал об этом
А что же не знать, арифметика то в любом случае будет двоичной.
Ответить с цитированием
  #9 (permalink)  
Старый 14.03.2018, 12:52
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,795

laimas,
Сообщение от laimas
А что же не знать
ну, не знать всегда есть что.
Правильнее сказать, что я не догадывался, что так можно проверить четность числа.

Побитовыми операциями вроде вообще никогда не пользовался, вероятно из-за этого и не догадался бы никогда, что можно использовать побитовое И.
Ответить с цитированием
  #10 (permalink)  
Старый 14.03.2018, 12:59
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Nexus
Побитовыми операциями вроде вообще никогда не пользовался
Ну так эффективнее сравнить младший бит числа, чем делить число по модулю, почему же не использовать. А четное число или нечетное если не важны десятичные результата, выгоднее не делить, а сдвинуть на N разрядов вправо, например на 1 разряд при делении на два. Соответственно при умножении сдвиг влево.

Последний раз редактировалось laimas, 14.03.2018 в 13:01.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перебор элементов массива и сравнение со значением TheSanches Общие вопросы Javascript 7 26.02.2018 19:54
Обход многомерного массива с задержкой после каждого цикла Walk Общие вопросы Javascript 2 14.08.2017 16:17
Свойства объекта, методы и this. Почему свойство вызывается с () ? jsuse Общие вопросы Javascript 2 04.11.2011 20:39
Можно ли как для произвольного массива создавать вызовы функций , имеющих на входе kefi Общие вопросы Javascript 3 17.04.2009 16:53
вставка элементов массива в текстовую форму по клику olezyk Общие вопросы Javascript 3 21.03.2009 22:01