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

标签 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)

但是如果您将 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/

相关文章:

Python-将字典中的两个列表相减

python - Django 重命名字典值

c# - 在 Dictionary<string, string> 中使用相同的键连接值

javascript - 从 shell 脚本终止 Node.js 程序

javascript - 悬停时是否可以显示按钮的描述?

javascript - 在 jsp 中拒绝 future 日期

javascript - 如何简化状态相关的 getter,最好是以 SOLID 的方式?

javascript - 在 forEach 循环期间跳过第一次迭代

c++ - 使用 map 计算每个单词在文件中出现的次数。 (c++)

groovy - 将名为 metaClass 的键放入 Map 中