ES6:在Set / Map迭代过程中从Set / Map中删除元素是否危险? [英] ES6: Is it dangerous to delete elements from Set/Map during Set/Map iteration?

查看:271
本文介绍了ES6:在Set / Map迭代过程中从Set / Map中删除元素是否危险?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

的安全代码新的Set()可能如下所示:

let items = [];
for (let item of set)
  if (isBad(item))
    items.push(item);
for (let item of items)
  set.delete(item)

我可以简化代码:

for (let item of set)
  if (isBad(item))
    set.delete(item);

安全代码>新地图()可能看起来像:

let keys = [];
for (let [key, val] of map)
  if (isBadKey(key) || isBadValue(val))
    keys.push(key);
for (let key of keys)
  map.delete(key)

我可以简化代码:

for (let [key, val] of map)
  if (isBadJey(key) || isBadValue(val))
    map.delete(key)


推荐答案

是的,你可以简化,这是完全安全的。

Yes, you can simplify to that, it's totally safe.


  • 集合和地图总是以插入顺序迭代

  • 删除项目不会影响任何迭代器的位置 - 您可以看到未被更改的集合的形状,只是被清空。

  • 因此:删除但尚未迭代的元素将不会被迭代

  • 已经迭代并被删除的元素(如您的情况)将不会影响其他任何元素迭代/查找。

  • 迭代期间添加(并且不是集合的一部分)的元素将始终被迭代

  • Sets and Maps are always iterated in insertion order
  • Deleting an item does not affect the position of any iterator - you can visualise the shape of the collection not being changed, just being emptied.
  • So: elements that are deleted and have not yet been iterated won't be iterated
  • Elements that have already been iterated and are deleted (like in your case) won't affect anything but other iterations/lookups.
  • Elements that are added (and are not already part of the collection) during the iteration will always be iterated

来自最后一点是,唯一危险的事情就是

From that last point follows that the only dangerous thing to do would be something like

const s = new Set([1]);
for (let x of s) {
    s.delete(x);
    s.add(1);
}

但不是因为未定义的行为或内存累积,而是因为无限循环。

but not because of undefined behaviour or memory accumulation, but because of the infinite loop.

这篇关于ES6:在Set / Map迭代过程中从Set / Map中删除元素是否危险?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆