Javascript 为什么我的解决方案有效而另一个解决方案无效?
如果注意到从索引0开始的for循环的结果,则向上计数并没有将数字23从数组中去掉 通过evenArray使用JavaScript循环删除所有非偶数值Javascript 为什么我的解决方案有效而另一个解决方案无效?,javascript,arrays,loops,for-loop,Javascript,Arrays,Loops,For Loop,如果注意到从索引0开始的for循环的结果,则向上计数并没有将数字23从数组中去掉 通过evenArray使用JavaScript循环删除所有非偶数值 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.lo
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);
var evenArray=[1,2,3,6,22,98,45,23,22,12];
对于(var i=0;i
//输出为[2,6,22,98,23,22,12] 迪伦的答案正确地解释了为什么一个可行,而另一个失败 无论如何,一个简单可行的解决方案是:
var evenArray=[1,2,3,6,22,98,45,23,22,12];
evenArray=evenArray.filter(函数(val){return val%2==0;});
console.log(evenArray)代码>当您从数组中拼接出一个数字时,数组中该点之后的所有值都会向左移动
在第二种方法中,索引6处的值为45
。你发现它很奇怪,所以你剪接它。现在23,22,和12被移动,所以23现在在指数6上。但是,由于您正在向前迭代,因此您的i++
将您上移到索引7,实际上跳过了23,这就是结果中包含23的原因
当您向后迭代时,可以避免此问题,因为所有被移位的数字都已被执行。只需在代码中添加一个打印:
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);
}
}
与原始阵列相比,它是剪切的。
原因是splice
正在动态剪切数组,因此索引在splice之后会更改,值23
原始索引是7
,但在splice之后它会移动到索引6
[1,2,3,6,22,98,45,23,22,12];
只需调试它,您就会看到。在每个循环中运行,每次拼接后暂停。你会看到发生了什么。太棒了!那是个好主意。我需要习惯用调试器剖析代码代码>在第二个代码片段中的拼接之后,应该可以纠正该代码片段的问题,对吗?编辑:甚至将拼接线更改为evenArray.splice(i--,1)代码>@JosephMarikle是的,这将纠正“漂移”问题
[1,2,3,6,22,98,45,23,22,12];