javascript - ES6 Map 中的所有对

标签 javascript ecmascript-6

在 ES6 中,给定一个 Map,如何访问顺序不重要的值对?

如果这是数组,我会这样做:

let arr = ["a", "b", "c", "d"];

for (let i=0; i < arr.length; i++)
  for (let j=i+1; j<arr.length; j++)
    console.log(`${arr[i]},${arr[j]}`);

对于 Google map ,我一直在努力寻找一种方法来以高效而优雅的方式完成类似的事情。迭代器看起来可以解决问题,但我假设它们的行为类似于 C++ 标准库迭代器,其中一个迭代器可以克隆为独立的迭代器。

我想到的最好的是:

var map = new Map([[0, "a"],[1, "b"],[2, "c"],[3, "d"]]);

for (let key of map.keys()) {
  let log_away = false;

  for (let other_key of map.keys()) {
    if (log_away)
        console.log(`${map.get(key)},${map.get(other_key)}`);
    else
        log_away = (key === other_key);
}

这相当简洁,但必须访问所有对,无论它们是否会被使用,效率都非常低。更糟糕的是,如果要尝试将其适应包含大型对象的 Set,最后键的比较必须是值的比较,这可能会非常昂贵。

最佳答案

您可以调用 values() 方法,然后对结果调用 Array.from() 以获得所有值的数组。然后您就可以像处理数组一样执行此操作。

const map = new Map([[0, "a"],[1, "b"],[2, "c"],[3, "d"]])

const values = Array.from(map.values())
for (let i = 0; i < values.length; i++)
  for (let j = i + 1; j < values.length; j++)
    console.log(`${values[i]},${values[j]}`)

关于javascript - ES6 Map 中的所有对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40064146/

相关文章:

javascript - 导入 "wrong"顺序的Web组件时出错

javascript - 为什么我无法通过大括号从 javascript 文件导入属性?

javascript - 调用 geocomplete 中的其他函数

javascript - 使用数据表的按钮自定义过滤

javascript - 使用 "push",网址发生变化,但我的整个页面变成空白

javascript - 无法在 ECMA6 中使用 'class' 关键字

javascript - 如何用包含升序字符串化数字的对象填充数组?

sublimetext3 - Sublime Text 3 中的 ES6 反引号支持

javascript - 在 React 中捕获获取错误的正确方法?

javascript - 为什么数组的旧内容被删除了?