为什么我的解决方案有效,而另一个解决方案没有?

时间:2015-06-25 20:22:10

标签: javascript arrays loops for-loop

如果您注意到for循环的结果从索引0开始并且向上计数并不是从数组中取出数字23。

使用JavaScript循环通过evenArray删除所有甚至

的值
var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = evenArray.length - 1; i >= 0; i--) {
  if(evenArray[i] % 2 != 0){
    evenArray.splice(i, 1);
   }
 };
 console.log(evenArray);  

//输出到此将是2,6,22,98,22,12;

var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = 0; i < evenArray.length; i++) {
    if(evenArray[i] % 2 != 0){
        evenArray.splice(i, 1);
    }
};

console.log(evenArray);

//输出为[2,6,22,98,23,22,12];

3 个答案:

答案 0 :(得分:9)

当你从数组中splice一个数字时,数组中该点之后的所有值都会向左移动。

在第二种方法中,在索引6处,值为45。你发现它是奇数,所以你拼接。现在23,22和12被转移,因此23现在在索引6处。但是由于你正在向前迭代,你的i++将你移动到索引7,有效地跳过23,这就是为什么23是在结果中。

当你向后迭代时,你可以避免这个问题,因为所有被移动的数字都已被采取行动。

答案 1 :(得分:3)

Dylan的回答是正确的,解释了为什么一个有效,另一个失败。

无论如何,一个可行的简单解决方案是:

&#13;
&#13;
var evenArray = [1,2,3,6,22,98,45,23,22,12];

evenArray = evenArray.filter(function(val) { return val % 2 == 0; });

console.log(evenArray);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

只需在代码中添加一个打印件:

var evenArray = [1,2,3,6,22,98,45,23,22,12];
for (var i = 0; i < evenArray.length; i++) {
    console.log("index:"+i+" value:"+evenArray[i])
    if(evenArray[i] % 2 != 0){
        evenArray.splice(i, 1);
    }
}

输出如下:

index:0 value:1
index:1 value:3
index:2 value:22
index:3 value:98
index:4 value:45
index:5 value:22
index:6 value:12

与原始数组相比,它正在切割。 原因是splice正在动态切割数组,因此索引在拼接后更改,值23原点索引为7,但在拼接之后它将移至索引{{1}之前}

6