javascript - 如何在不重新创建 map 的情况下从 ES6 map 对象中删除前 N 项?

标签 javascript syntax ecmascript-6

假设我想在不重新创建 map 的情况下删除 map 的前 100 个条目,并且还以最有效的方式执行此操作。

假设您有一个 500 件商品 ES6 Map Object :

let map = new Map(... 500 items)

目前我是这样做的:

const newCache = new Map(
  Array.from(map).slice(100)
)

map.clear()

map = newCache

但这会重新创建 map 。

另一种方法是遍历前 100 个键:

Array.from(map.keys())
     .slice(0, 100)
     .forEach(key => map.delete(key))

但是看起来效率很低。

最佳答案

获取 Map 的前 100 个键的数组,然后删除它们。

var keys = Array.from(map.keys()).slice(0, 100);
keys.forEach(k => map.delete(k));

或者您可以使用循环,这样您就不需要创建要切片的数组。

var i = 0;
for (var k of map.keys()) {
    if (i++ > 100) {
        break;
    }
    map.delete(k);
}

我创建了一个 jsperf用你的两种方法和这个循环进行测试。循环是最有效的,比切片键快 5 倍。

关于javascript - 如何在不重新创建 map 的情况下从 ES6 map 对象中删除前 N 项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45730750/

相关文章:

javascript - 为什么 XMLHttpRequest 对象的属性只能通过 console.log() 打印?

javascript - 如何显示在内联 block 元素下方放置一个按钮?

c - 忽略分号 C 语法

javascript - "Must use destructuring state assignment": How to destructure from object and place on property inside object literal

haskell - 使用 $ 运算符将两个括号链接在一起

vector - 为什么 `vector` 和 `[...]` 在 Clojure 中有时表现不同?

javascript - 有没有办法在 es6 中导入一个只适用于一个特定元素并且不是全局的 css 文件?

javascript - 使用 json 数据制作数字动画

javascript - 使用 Vue Router 时 Pusher 和 Vue.js 组件不会离开 channel

javascript - 如何使用字符串创建 DOM 元素来使 Angular 单击绑定(bind)起作用?