Как перебирать массив и удалять элементы в JavaScript [дубликат]


этот вопрос уже есть ответ здесь:

  • Цикл через массив и удаление элементов, не нарушая цикла 11 ответов

У меня есть массив элементов и нужно удалить некоторые из них. Проблема в том, что JavaScript, похоже, не имеет для каждого цикла, и если я использую цикл for, я сталкиваюсь с проблемами с ним в основном попытка проверить элементы за пределами массива или отсутствующие элементы в массиве из-за изменения индексов. Позвольте мне показать вам, что я имею в виду:

var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = 0; i < elements.length; i++){
    if(elements[i] == 5){
        elements.splice(i, 1);
    }
}

проблема в том, что когда элементы[1] удаляются, элементы[2] становятся элементами[1]. Итак, первая проблема заключается в том, что некоторые элементы никогда не рассматриваются. Другая проблема заключается в этом .длина изменяется, и если я жестко кодирую границы, то я могу пытаться исследовать элементы за пределами массива. Так что это лучший способ сделать это невероятно простая вещь?

6 56

6 ответов:

Начнем с самого верха!

var elements = [1, 5, 5, 3, 5, 2, 4];
for(var i = elements.length -1; i >= 0 ; i--){
    if(elements[i] == 5){
        elements.splice(i, 1);
    }
}

вы могли бы использовать filter метод здесь:

var elements = [1, 5, 5, 3, 5, 2, 4].filter(function(a){return a !== 5;});
//=> elements now [1,3,2,4]

или если вы не хотите, чтобы коснуться elements:

var elementsfiltered
   ,elements = [1, 5, 5, 3, 5, 2, 4]
                .filter( function(a){if (a!==5) this.push(a); return true;},
                         elementsfiltered = [] );
   //=> elementsfiltered = [1,3,2,4], elements = [1, 5, 5, 3, 5, 2, 4]

посмотреть документация MDN на filter

в качестве альтернативы вы можете расширить Array.prototype

Array.prototype.remove = Array.prototype.remove || function(val){
    var i = this.length;
    while(i--){
        if (this[i] === val){
            this.splice(i,1);
        }
    }
};
var elements = [1, 5, 5, 3, 5, 2, 4];
elements.remove(5);
//=> elements now [1,3,2,4]

var elements = [1, 5, 5, 3, 5, 2, 4];    
var i = elements.length;
while (i--) {
    if (elements[i] == 5) {
        elements.splice(i, 1);
    }
}
console.log(elements);

С помощью массив.shift ():

var array = [1, 2, 3, 'a', 'b', 'c'];
while (array.length > 0) {
  console.log(array.shift());
}

Edit: вероятно, не подходит для спецификаций. Я неправильно понял вопрос (только удалить некоторых elements) и слишком стремился вместо этого добавить метод, который еще не был упомянут...

Вы можете просто уменьшить i всякий раз, когда вы удалите элемент.

var elements = [1, 5, 5, 3, 5, 2, 4];

var l = elements.length;
for(var i = 0; i < l; i++){
    if(elements[i] == 5){
        elements.splice(i, 1);
        i--;
    }
}

console.log(elements);

Это пример использования массив.indexOf,пока и массив.сращивание для удаления встроенных элементов.

var elements = [1, 5, 5, 3, 5, 2, 4];
var remove = 5;
var index = elements.indexOf(remove);

while (index !== -1) {
    elements.splice(index, 1);
    index = elements.indexOf(remove);
}

console.log(elements);

On jsfiddle