Map.forEach,为什么删除循环中的项目有效?

时间:2018-04-25 11:09:04

标签: javascript dictionary

如果在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

2 个答案:

答案 0 :(得分:2)

数组具有动态索引,如果一个元素被拼接,其余元素只会移动并获得新的内容。

这就是原因,因为你通过从头开始迭代来拼接错误的部分。

通过使用Map,索引用作键,如果一个项目被删除,则地图的所有其他项目都会保留其键。

通过稍后渲染数组,丢失的项目及其键已经消失。

答案 1 :(得分:1)

  

如果在forEach循环中删除数组的项目,则可能会遗漏一些元素

请参阅Array.prototype.forEach

  

如果更改了数组现有元素的值,则传递给回调的值将是forEach()访问它们时的值;访问之前删除的元素不会被访问。 如果在迭代过程中删除了已访问过的元素(例如使用shift()),则会跳过后面的元素 [...]

  

Map.forEach中有哪些内部可确保可信删除和其他操作(插入?)

请参阅Map.prototype.forEach

  

forEach方法为实际存在的地图的每个键执行一次提供的回调。

由于密钥不受订单约束,因此不会影响循环。是的,它是按插入顺序执行的,但是当使用forEach从地图中删除元素时,这不会改变循环。