如何在Javascript映射中交换键和值

时间:2019-03-30 04:06:58

标签: javascript ecmascript-6

我有这张ES6地图:

Map(6) {"Coratia" => 1, "Korea" =>, "Norway" => 2, "Munich" => 1, "Austrlia" => 1, ...}

我想交换键和值,使其像这样:

Map(6) {1 => "Coratia", 1 => "Korea", 2 => "Norway", 1 => "Munich", 1 => "Australia", ...}

2 个答案:

答案 0 :(得分:0)

这里有一个解决方案,它使用了 CodyKnapp 所提到的想法。它使用Array.reduce()生成value->key反向Map

let myMap = new Map([
   ["Cortia", 1],
   ["Korea", 1],
   ["Norway", 2]
]);

// Generate the reverse Map.

let res = [...myMap.entries()].reduce((acc, [k, v]) =>
{
    acc.has(v) ? acc.set(v, acc.get(v).concat(k)) : acc.set(v, [k]);
    return acc;
}, new Map());

// Log the new generated Map.

res.forEach((v, k) => console.log(`${k} => ${v}`));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}

注意,如注释中所述,您不能有一个Map可以为多个不同的key复制相同的values。 / p>

答案 1 :(得分:0)

ES6 Map转换为数组时如下所示:

 [[key, value], [key, value], [key, value],...]

一个二维数组。

演示大纲

  • 假设我们有一个包含键和值的Map,制作一个新的空Map。

  • 使用for...of循环遍历整个Map

  • 在每次迭代.get()上,键/值然后将值作为键,将键作为值分配给空Map。

  • 控制台不会以常规方式显示自己,以便显示其内容,它必须遍历每个键/值对并记录它们。

let x2D = new Map([
  ['a', 1],
  ['b', 2],
  ['c', 3],
  ['d', 4],
  ['e', 5]
]);

let d2X = new Map();

for (let [key, value] of x2D) {
  let v = x2D.get(key);
  d2X.set(v, key);
}

for (let [k, v] of d2X) {
  console.log('[' + k + ', ' + v + ']');
}