ES6地图中的所有对

Mar*_*ark 3 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]}`);
Run Code Online (Sandbox Code Playgroud)

有了地图,我很难找到一种方法,以高效和优雅的方式做类似的事情.迭代器看起来像他们会这样做,但我假设它们的行为类似于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);
}
Run Code Online (Sandbox Code Playgroud)

这是相当简洁的,但必须访问所有对,无论它们是否将被使用,都难以实现.更糟糕的是,如果要尝试将其调整为包含大型对象的Set,则最后的键的比较必须是值的比较,这可能非常昂贵.

Mic*_*ski 6

您可以调用该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]}`)
Run Code Online (Sandbox Code Playgroud)