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

Cap*_*ack 68 javascript iteration bounds

我有一系列元素,需要从中删除某些元素.问题是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);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是当元素[1]被移除时,元素[2]变成元素[1].所以第一个问题是从未检查过某些元素.另一个问题是.length更改,如果我硬编码边界,​​那么我可能会尝试检查超出数组边界的元素.那么做这件非常简单的事情的最佳方法是什么?

Jea*_*rin 159

从顶部开始!

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `for(var i = elements.length; i - ;)`可能是更常见的写入方式. (11认同)
  • 我希望我能不止一次投票。奥卡姆正在向您发送来自远方的宇宙高五。 (2认同)
  • 认真吗 一个O(n ^ 2)答案,有147个赞成票,没有反对票?这是给你的选票。 (2认同)

Koo*_*Inc 33

你可以在filter这里使用这个方法:

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

或者如果你不想触摸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]
Run Code Online (Sandbox Code Playgroud)

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]
Run Code Online (Sandbox Code Playgroud)


rou*_*ble 5

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);
Run Code Online (Sandbox Code Playgroud)

  • 在代码可读性方面,这个答案很可爱 (2认同)