Я пытаюсь удалить элемент массива в forEach
цикле, но у меня проблемы со стандартными решениями, которые я видел.
Вот что я сейчас пытаюсь:
review.forEach(function(p){
if(p === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(p, 1);
}
});
Я знаю, что это происходит, if
потому что я вижу YippeeeeeE!!!!!!!!!!!!!
в консоли.
МОЯ ПРОБЛЕМА: я знаю, что мой цикл for и логика if работают, но моя попытка удалить текущий элемент из массива не удалась.
ОБНОВИТЬ:
Пробовал ответ Xotic750, и элемент все еще не удаляется:
Вот функция в моем коде:
review.forEach(function (item, index, object) {
if (item === '\u2022 \u2022 \u2022') {
console.log('YippeeeE!!!!!!!!!!!!!!!!')
object.splice(index, 1);
}
console.log('[' + item + ']');
});
Вот результат, в котором массив все еще не удален:
[Scott McNeil]
[reviewed 4 months ago]
[ Mitsubishi is AMAZING!!!]
YippeeeE!!!!!!!!!!!!!!!!
[• • •]
Таким образом, очевидно, что он входит в оператор if, как указано, но также очевидно, что [• • •] все еще там.
javascript
foreach
novicePrgrmr
источник
источник
forEach
? Если вы хотите удалить элементы, наиболее подходящей функцией являетсяfilter
.index
атрибут, а неitem
для своегоsplice
Ответы:
Похоже, вы пытаетесь это сделать?
Итерировать и изменять массив с помощью Array.prototype.splice
Что отлично работает для простого случая, когда у вас нет двух одинаковых значений, как у соседних элементов массива, иначе у вас есть эта проблема.
Итак, что мы можем сделать с этой проблемой при повторении и изменении массива? Обычное решение - работать в обратном порядке. Пока используете ES3 , но при желании можете использовать для сахара
Хорошо, но вы хотели использовать итерационные методы ES5. Ну, и вариант - использовать Array.prototype.filter, но это не изменяет исходный массив, а создает новый, поэтому, хотя вы можете получить правильный ответ, это не то, что вы, кажется, указали.
Мы также могли бы использовать ES5 Array.prototype.reduceRight , но не для его свойства уменьшения, а скорее для его свойства итерации, т.е. итерации в обратном порядке.
Или мы могли бы использовать ES5 Array.protoype.indexOf вот так.
Но вы конкретно хотите использовать ES5 Array.prototype.forEach , так что мы можем сделать? Что ж, нам нужно использовать Array.prototype.slice, чтобы сделать неглубокую копию массива, и Array.prototype.reverse, чтобы мы могли работать в обратном порядке для изменения исходного массива.
Наконец, ES6 предлагает нам еще несколько альтернатив, в которых нам не нужно делать неглубокие копии и переворачивать их. В частности, мы можем использовать генераторы и итераторы . Однако в настоящее время поддержка довольно низкая.
Во всем вышесказанном следует отметить то, что если вы удаляли NaN из массива, то сравнение с равными значениями не сработает, потому что в Javascript
NaN === NaN
это false. Но мы собираемся проигнорировать это в решениях, поскольку это еще один неуказанный крайний случай.Итак, у нас есть более полный ответ с решениями, которые все еще имеют крайние случаи. Самый первый пример кода все еще верен, но, как уже говорилось, не без проблем.
источник
console.log(review);
послеforEach
, как в моем примере.Используйте
Array.prototype.filter
вместоforEach
:источник
Хотя ответ Xotic750 предлагает несколько хороших моментов и возможных решений, иногда лучше просто .
Вы знаете, что итерируемый массив мутирует в самой итерации (т.е. удаляет элемент => изменяется индекс), поэтому простейшая логика - вернуться назад на старомодном языке
for
(а-ля C ):Если вы действительно думаете об этом, a
forEach
- это просто синтаксический сахар дляfor
цикла ... Так что, если он вам не помогает, просто перестаньте ломать себе голову об этом.источник
Вы также можете использовать indexOf вместо этого
источник
Я понял, что вы хотите удалить из массива с помощью условия и иметь другой массив, в котором элементы удалены из массива. Верно?
Как насчет этого?
Надеюсь на эту помощь ...
Кстати, я сравнивал for-loop с forEach.
Если удалить, если строка содержит 'f', результат будет другим.
И убирать на каждой итерации, тоже результат разный.
источник
Следующее даст вам все элементы, которые не равны вашим специальным символам!
источник
Вот как это нужно делать:
источник
if
оператор.item, index, object