如果您在 forEach 循环中删除数组的项目,您可能会遗漏一些元素,例如:
let arr = [['One', 1], ['Two', 2], ['Three', 3], ['Four', 4]]
arr.forEach((i, ix) => i[1] <= 3 && arr.splice(ix,1)); // Two is not deleted
console.log(arr)
但是如果您将 forEach 应用于 Map 对象,它会起作用:
let map = new Map( [['One', 1], ['Two', 2], ['Three', 3], ['Four', 4]] );
map.forEach( (value,key) => value <= 3 && map.delete(key));
console.log([...map.entries()])
Map.forEach 中确保可信删除和其他操作(插入?)的内部机制是什么
(这起源于一个related question)
最佳答案
数组有动态索引,如果一个元素被拼接,其余元素就会移动并获得新的索引。
就是这个原因,因为你通过从头开始迭代拼接了错误的部分。
通过使用 Map
,索引用作键,如果一个项目被删除, map 的所有其他项目将保留其键。
通过稍后渲染数组,丢失的项目及其键都消失了。
关于javascript - Map.forEach,为什么删除循环中的项目有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50020756/