如何迭代数组并删除JavaScript中的元素

我有一组元素,需要从中删除某些元素。 问题是,JavaScript似乎并没有为每个循环,如果我使用for循环,我遇到了问题,基本上试图检查超出数组界限的元素,或缺less数组中的元素,因为索引更改。 让我告诉你我的意思:

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] 

请参阅filter MDN文档

或者,您可以扩展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()); } 

编辑:可能不符合规格。 我误解了这个问题(只删除了某些元素),而且太急于添加一个尚未提及的方法。

你可以简单地减lessi每当你删除一个项目。

 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 , 而 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上

    Interesting Posts