Ответ 1
Начните с вершины!
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);
}
}
У меня есть массив элементов и нужно удалить некоторые из них. Проблема в том, что 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]. Поэтому первая проблема заключается в том, что некоторые элементы никогда не рассматриваются. Другая проблема заключается в том, что .length изменяется, и если я жестко кодирую границы, тогда я могу попытаться изучить элементы за пределами массива. Итак, что лучший способ сделать это невероятно просто?
Начните с вершины!
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);
Использование Array.shift():
var array = [1, 2, 3, 'a', 'b', 'c'];
while (array.length > 0) {
console.log(array.shift());
}
Изменить: Вероятно, это не соответствует спецификациям. Я неправильно понял вопрос (удалить только некоторые элементы) и был слишком нетерпелив, чтобы добавить метод, который еще не упоминался...
Вы можете просто уменьшить 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);
Это пример использования Array.indexOf, while и Array.splice для удаления встроенных элементов.
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);
Вкл jsfiddle