Подтвердить что ты не робот

Array.splice удаление значений из остальных элементов

Я столкнулся с этим странным побочным эффектом array.splice и перегнал код до минимума, необходимого для воссоздания. Да, многое из этого можно сделать на одной строке с array.filter, но меня интересует, совершила ли я ошибку или что-то еще происходит.

var array = [];

for (var i = 0; i < 10; i++) {
  array.push({
    value: i
  });
}

array.forEach(function(item, index, intArray) {
  if (item.value % 2 == 1) {
    item.odd = true;
  } else {
    item.odd = false;
  }

  if (item.odd) {
    console.log("Removing " + item.value);
    intArray.splice(index, 1);
  }

});

console.log(array);
4b9b3361

Ответ 1

Я думаю, что когда вы сплайсируете массив на каждом нечетном числе, forEach заканчивается пропуском следующего элемента, который является четным числом. Таким образом, эти элементы не изменяются вообще.

var array = [];

for (var i = 0; i < 10; i++) {
  array.push({
    value: i
  });
}

array.forEach(function(item, index, intArray) {
  console.log(item); // only prints out 0, 1, 3, 5, 7, 9

  if (item.value % 2 == 1) {
    item.odd = true;
  } else {
    item.odd = false;
  }

  if (item.odd) {
    console.log("Removing " + item.value);
    intArray.splice(index, 1);
  }

});

console.log(array);