如果您注意到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];
答案 0 :(得分:9)
当你从数组中splice
一个数字时,数组中该点之后的所有值都会向左移动。
在第二种方法中,在索引6处,值为45
。你发现它是奇数,所以你拼接。现在23,22和12被转移,因此23现在在索引6处。但是由于你正在向前迭代,你的i++
将你移动到索引7,有效地跳过23,这就是为什么23是在结果中。
当你向后迭代时,你可以避免这个问题,因为所有被移动的数字都已被采取行动。
答案 1 :(得分:3)
Dylan的回答是正确的,解释了为什么一个有效,另一个失败。
无论如何,一个可行的简单解决方案是:
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;
答案 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