Как удалить элемент из массива в forEach?
Я пытаюсь удалить элемент в массиве в цикле forEach
, но у меня проблемы со стандартными решениями, которые я видел.
Это то, что я сейчас пытаюсь сделать:
review.forEach(function(p){
if(p === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(p, 1);
}
});
Я знаю, что он попадает в if
, потому что я вижу YippeeeeeE!!!!!!!!!!!!!
в консоли.
МОЯ ПРОБЛЕМА: Я знаю, что мой цикл for и если логика звуковая, но моя попытка удалить текущий элемент из массива терпит неудачу.
UPDATE:
Пробовал ответ 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, как указано, но также очевидно, что [• • •] все еще существует.
Ответы
Ответ 1
Похоже, вы пытаетесь это сделать?
Итерации и мутации массива с помощью Array.prototype.splice
var pre = document.getElementById('out');
function log(result) {
pre.appendChild(document.createTextNode(result + '\n'));
}
var review = ['a', 'b', 'c', 'b', 'a'];
review.forEach(function(item, index, object) {
if (item === 'a') {
object.splice(index, 1);
}
});
log(review);
<pre id="out"></pre>
Ответ 2
Используйте Array.prototype.filter
вместо forEach
:
var pre = document.getElementById('out');
function log(result) {
pre.appendChild(document.createTextNode(result + '\n'));
}
var review = ['a', 'b', 'c', 'b', 'a', 'e'];
review = review.filter(item => item !== 'a');
log(review);
Ответ 3
Вместо этого вы можете использовать indexOf, чтобы сделать это
var i = review.indexOf('\u2022 \u2022 \u2022');
if (i !== -1) review.splice(i,1);
Ответ 4
Я понял, что вы хотите удалить из массива, используя условие, и иметь другой массив, в котором элементы удалены из массива. Правильно?
Как насчет этого?
var review = ['a', 'b', 'c', 'ab', 'bc'];
var filtered = [];
for(var i=0; i < review.length;) {
if(review[i].charAt(0) == 'a') {
filtered.push(review.splice(i,1)[0]);
}else{
i++;
}
}
console.log("review", review);
console.log("filtered", filtered);
Ответ 5
Вот как вы должны это сделать:
review.forEach(function(p,index,object){
if(review[index] === '\u2022 \u2022 \u2022'){
console.log('YippeeeE!!!!!!!!!!!!!!!!')
review.splice(index, 1);
}
});
Ответ 6
Следующее предоставит вам все элементы, которые не равны вашим особым символам!
review = jQuery.grep( review, function ( value ) {
return ( value !== '\u2022 \u2022 \u2022' );
} );
Ответ 7
Хотя ответ Xotic750 содержит несколько полезных моментов и возможных решений, иногда проще -.
Вы знаете, что итеративный массив мутирует в самой итерации (т.е. удаляет элемент => изменения индекса), поэтому самая простая логика - вернуться назад по старинке for
(на языке C язык):
let arr = ['a', 'a', 'b', 'c', 'b', 'a', 'a'];
for (let i = arr.length - 1; i >= 0; i--) {
if (arr[i] === 'a') {
arr.splice(i, 1);
}
}
document.body.append(arr.join());