80

我有一个元素数组,需要从中删除某些元素。问题是 JavaScript 似乎没有 for each 循环,如果我使用 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 发生变化,如果我对边界进行硬编码,那么我可能会尝试检查超出数组边界的元素。那么做这件难以置信的简单事情的最好方法是什么?

4

6 回答 6

188

从顶部开始!

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);
    }
}
于 2013-05-03T05:58:37.997 回答
37

您可以在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]
于 2013-05-03T06:02:18.723 回答
7

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);

于 2017-02-27T21:58:03.580 回答
2

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);

于 2016-10-18T14:42:12.337 回答
1

使用Array.shift()

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

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

于 2015-02-23T15:09:42.437 回答
0

这是使用Array.indexOfwhileArray.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 上

于 2013-05-03T06:12:54.093 回答