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

如果注意到从索引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.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];