反转地图对象

pou*_*uya 5 javascript node.js typescript

我想知道在Map中反转键和值的最便捷方法是什么。是否有任何内置方法,或者应该通过迭代键和值来完成?

const map: Map<string, number> = new Map()
Run Code Online (Sandbox Code Playgroud)
const inverse: Map<number, string>
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 8

您可以使用Array.from和将逆元组传递给构造函数Array#reverse

new Map(Array.from(origMap, a => a.reverse()))
Run Code Online (Sandbox Code Playgroud)

看到它运行在一个示例上:

new Map(Array.from(origMap, a => a.reverse()))
Run Code Online (Sandbox Code Playgroud)

  • 它也可以是“new Map(Array.from(origMap,entry =&gt; [entry[1],entry[0]]))”。与原始解决方案不同,TypeScript 不会抱怨它 (5认同)

Nic*_*wer 6

假设没有重复值,您可以执行如下逆操作:

const map: Map<string, number> = new Map();
map.set('3', 3);
map.set('4', 4);

const inverse: Map<number, string> = new Map();
map.forEach((value, key) => inverse.set(value, key));
Run Code Online (Sandbox Code Playgroud)

  • @ShaunLuttin Maps 没有 `.reduce` 方法,所以我假设您的意思是将其转换为数组,然后进行归约。 (3认同)

ggo*_*len 5

您可以在原始映射上使用扩展运算符来获取键值数组对,您可以.map交换每对。最后,将结果转储到Map副本的构造函数中。任何重复的密钥都将丢失。

const orig = new Map([["a", 1], ["b", 2]]);
const cpy = new Map([...orig].map(e => e.reverse()));

console.log([...orig]);
console.log([...cpy]);
Run Code Online (Sandbox Code Playgroud)

这很简洁,但确实涉及额外的数组创建,正如不可模仿的trincot所指出的那样。只有当地图很大时这才是问题。

顺便说一句,如果您的原始值确实是数字并且不稀疏,请考虑为您的“翻转”地图使用普通的旧数组。这可能会提高性能和语义,完全取决于您的用例。