Как перебирать массив и удалять элементы в 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 ответов:
Начнем с самого верха!
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