ES6:在Set / Map迭代期间从Set / Map中删除元素是否危险?

木通哥

的安全代码new 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);

的安全代码new Map()可能如下所示:

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 (isBadKey(key) || isBadValue(val))
    map.delete(key)
贝吉

是的,您可以简化一下,这是完全安全的。

  • 集和地图始终按插入顺序进行迭代
  • 删除项目不会影响任何迭代器的位置-您可以直观地看到集合的形状没有改变,只是被清空了。
  • 因此:被删除但尚未迭代的元素将不会被迭代
  • 已经被迭代并被删除的元素(如您的情况)将不会影响其他迭代/查找。
  • 在迭代过程中添加的元素(尚未包含在集合中)将始终被迭代

从最后一点开始,唯一危险的事情就是

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

es6 映射设置而不调用 map.set()

来自分类Dev

是否可以在ES6 Set实例上使用数组迭代方法?

来自分类Dev

遍历Coffeescript中的ES6 Set / Map(使用`of`运算符)

来自分类Dev

访问 ES6 Set 对象中的字符串

来自分类Dev

es6 Map and Set复杂度,v8实现

来自分类Dev

获取或设置Javascript ES6 Map中的元素?

来自分类Dev

如何从存储在std :: map中的std :: set中删除元素?

来自分类常见问题

.map()Javascript ES6 Map?

来自分类Dev

如何获得ES6 Map的最后一个元素而无需迭代?

来自分类Dev

使用Set的ES6中没有重复项的文字对象数组

来自分类Dev

在ES6 Set中存储阵列并按值访问它们

来自分类Dev

ES6 Map垫片如何工作

来自分类Dev

es6 Map 的替代品

来自分类Dev

Javascript ES6 Promises with map

来自分类Dev

在 javascript map es6 中传递附加参数

来自分类Dev

使用for..of进行迭代时删除Set中的元素是否安全?

来自分类Dev

是否可以通过存储桶迭代器从std :: unordered_set中删除元素?

来自分类Dev

使用.find无法引用c ++ map / set迭代器

来自分类Dev

ES6 Map的Array.map等效于什么?

来自分类Dev

迭代es6中的对象并返回新对象

来自分类Dev

迭代对象数组并分离比较es6中的日期

来自分类Dev

在迭代期间在 set 上调用 erase()

来自分类Dev

创建一个从ES6 Map扩展的类

来自分类Dev

TypeScript:如何导入ES6 Map(找不到NetBeans)

来自分类Dev

通过 setState 正确修改 ES6 Map

来自分类Dev

Vanilla JS - ES6:.map() 不是函数

来自分类Dev

c ++ map / set迭代器不可取消--map <const char *,string>

来自分类Dev

使用 es6 map 更改数组中元素的特定属性

来自分类Dev

在 ES6 中的 Map 中存储值的回调函数

Related 相关文章

热门标签

归档