JavaScript数组-forEach中的拼接调用意外结果

JavaScript数组-forEach中的拼接调用意外结果,javascript,arrays,foreach,splice,Javascript,Arrays,Foreach,Splice,我注意到我的代码中有一个bug,并试图用下面显示的更简单的JavaScript重现它。目标是对数组进行排序并将元素“x”与“y”进行比较,但不要浪费时间将“y”与“x”进行比较。请注意,我还在其他代码中使用对象比较属性 var a=[1,3,2,5]; a、 排序((b,c)=>b-c); a、 slice().forEach((x,ind)=>{ console.log(a.splice(ind,1)); a、 forEach(z=>{console.log(z);}); });好吧,你从

我注意到我的代码中有一个bug,并试图用下面显示的更简单的JavaScript重现它。目标是对数组进行排序并将元素“x”与“y”进行比较,但不要浪费时间将“y”与“x”进行比较。请注意,我还在其他代码中使用对象比较属性

var a=[1,3,2,5];
a、 排序((b,c)=>b-c);
a、 slice().forEach((x,ind)=>{
console.log(a.splice(ind,1));
a、 forEach(z=>{console.log(z);});
});好吧,你从

[1, 2, 3, 5]
然后删除
0
索引处的元素,结果是:

[2, 3, 5]
在下一次迭代中,删除
1
索引处的元素,结果是

[2, 5]
在下一次迭代中,您将删除
2
索引处的元素,该索引不存在,因此您仍然有

[2, 5]
您可能想做:

console.log(a.splice(ind, 0));
好吧,你从

[1, 2, 3, 5]
然后删除
0
索引处的元素,结果是:

[2, 3, 5]
在下一次迭代中,删除
1
索引处的元素,结果是

[2, 5]
在下一次迭代中,您将删除
2
索引处的元素,该索引不存在,因此您仍然有

[2, 5]
您可能想做:

console.log(a.splice(ind, 0));

我相信你是在问为什么你不能从这个例子中得到你想要的结果。这背后的原因是您正在更改循环中数组a的长度,同时希望索引不会更改


因此,当您到达
ind=2
时,您正试图从一个不存在的索引中删除项。要解决这个问题,您需要记录删除和更改了多少项
console.log(a.splice(ind,1))
console.log(a.splice(ind-itemCount,1))

我想你是在问为什么你不能从这个例子中得到你想要的结果。这背后的原因是您正在更改循环中数组a的长度,同时希望索引不会更改


因此,当您到达
ind=2
时,您正试图从一个不存在的索引中删除项。要解决这个问题,您需要记录删除和更改了多少项
console.log(a.splice(ind,1))
console.log(a.splice(ind-itemCount,1))

您的问题是什么?您正在迭代一个数组,并在其间删除其中的一项,这将重新排列索引,这将在下一次迭代中更改循环的行为。您的问题是什么?您正在迭代一个数组,并在其间删除其中的一项,这将重新排列索引,这将在接下来的迭代中改变循环的行为。