如果在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)
但是如果你将每个地方的对象申请给它,那就可以了:
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)
答案 0 :(得分:2)
数组具有动态索引,如果一个元素被拼接,其余元素只会移动并获得新的内容。
这就是原因,因为你通过从头开始迭代来拼接错误的部分。
通过使用Map
,索引用作键,如果一个项目被删除,则地图的所有其他项目都会保留其键。
通过稍后渲染数组,丢失的项目及其键已经消失。
答案 1 :(得分:1)
如果在forEach循环中删除数组的项目,则可能会遗漏一些元素
如果更改了数组现有元素的值,则传递给回调的值将是forEach()访问它们时的值;访问之前删除的元素不会被访问。 如果在迭代过程中删除了已访问过的元素(例如使用shift()),则会跳过后面的元素 [...]
Map.forEach中有哪些内部可确保可信删除和其他操作(插入?)
forEach方法为实际存在的地图的每个键执行一次提供的回调。
由于密钥不受订单约束,因此不会影响循环。是的,它是按插入顺序执行的,但是当使用forEach
从地图中删除元素时,这不会改变循环。