JavaScript数组 - 在forEach意外结果

时间:2018-03-30 22:05:51

标签: javascript arrays foreach splice

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

var a = [1, 3, 2, 5];
a.sort((b, c) => b - c);
a.slice().forEach((x, ind) => {
  console.log(a.splice(ind, 1));
  a.forEach(z => { console.log(z); });
});

上面的其余元素是2和5.我希望删除元素3和5。 (使用slice()时使用或不使用副本的方法相同)

我最终只是使用索引恢复for循环,其中内部数组的索引从外部数组的索引+ 1开始。

2 个答案:

答案 0 :(得分:3)

好吧,你从

开始
[1, 2, 3, 5]

并删除0索引处的元素,最后是:

[2, 3, 5]

在下一次迭代中,删除1索引处的元素,最后以

结尾
[2, 5]

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

[2, 5]

您可能想要这样做:

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

答案 1 :(得分:0)

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

因此,当您到达ind = 2时,您正尝试从不存在的索引中删除项目。要解决此问题,您需要计算已移除的项目数,并将console.log(a.splice(ind, 1));更改为console.log(a.splice(ind - itemCount, 1));