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

Как удалить элемент из массива в 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, как указано, но также очевидно, что [• • •] все еще существует.

4b9b3361

Ответ 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());