可直接用new map([...map.entries()].map(([k,v])=>[v,k]))一行反转map的键值对,原value变key、原key变value;若value重复则后项覆盖前项,需转为列表时改用循环或reduce处理。

直接用 Map.prototype.entries() 配合解构和构造函数,就能一行完成 Key-Value 反转,无需手动遍历。
entries() 提供可迭代的 [key, value] 对
map.entries() 返回一个迭代器,每次产出形如 [k, v] 的数组。这正好是反转时需要的“原始值对”,只需把顺序调换即可作为新 Map 的输入。
- 原 Map 中的 value 成为新 Map 的 key
- 原 Map 中的 key 成为新 Map 的 value
- 注意:若原 Map 的 value 有重复,反转后会丢失(Map key 唯一)
一行构造反转后的 Map
利用扩展运算符 ... 和解构赋值,把每个 [k, v] 变成 [v, k]:
const reversed = new Map([...originalMap.entries()].map(([k, v]) => [v, k]));
例如:
const userRoles = new Map([['alice', 'admin'], ['bob', 'editor'], ['carol', 'viewer']]);
const roleUsers = new Map([...userRoles.entries()].map(([user, role]) => [role, user]));
// roleUsers → Map { 'admin' → 'alice', 'editor' → 'bob', 'viewer' → 'carol' }
处理 value 不唯一的情况
如果原始 value 可能重复(比如多个用户角色相同),直接反转会覆盖。此时可改为映射到值列表:
const roleUserList = new Map();
for (const [user, role] of originalMap.entries()) {
if (!roleUserList.has(role)) roleUserList.set(role, []);
roleUserList.get(role).push(user);
}
或用 reduce 简写:
const roleUserList = [...originalMap.entries()].reduce((acc, [user, role]) => {
const list = acc.get(role) || [];
acc.set(role, list.concat(user));
return acc;
}, new Map());
性能与适用性提醒
该方法适用于中小型 Map(千级以内键值对)。entries() + 数组 map 是浅层操作,不修改原 Map,语义清晰。
- 不支持 Symbol 或对象作新 key?没问题——只要原 value 类型允许作 Map key(即能被严格相等判断),就可安全反转
- 想保留插入顺序?Map 构造时按传入顺序建立,entries() 也按插入顺序产出,反转后顺序对应的是原 value 的首次出现顺序
- 需深拷贝 value/key?entries() 只提供引用,如需深拷贝需额外处理










