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

JavaScript array - splice call within forEach unexpected result

我注意到我的代码中有一个错误,并尝试使用如下所示的更简单的 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 开始。

嗯,你从

开始
[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));