You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于交换键值后的ES6 Map创建JavaScript对象

交换ES6 Map的键与值并转为JavaScript对象

嘿,这个问题得注意一个关键细节:普通JavaScript对象的键是唯一的,如果你直接把原Map里重复的值当作新对象的键,后面的键值对会覆盖前面的,导致数据丢失。所以咱们得先处理重复值的情况,把对应原键收集到数组里,再转成对象。

方案一:保留所有数据(推荐)

这个方案会把相同值对应的所有原键存到数组里,不会丢失任何数据:

// 先模拟你的原Map(补全了Korea对应的值为1,应该是笔误吧😉)
const originalMap = new Map([
  ["Croatia", 1],
  ["Korea", 1],
  ["Norway", 2],
  ["Munich", 1],
  ["Australia", 1]
]);

// 创建一个新的Map来存储反转后的键值关系
const reversedMap = new Map();

// 遍历原Map的每一项
originalMap.forEach((value, key) => {
  if (reversedMap.has(value)) {
    // 如果新Map里已经有这个值作为键,就把原键添加到对应的数组中
    reversedMap.get(value).push(key);
  } else {
    // 如果没有,就初始化一个数组存入原键
    reversedMap.set(value, [key]);
  }
});

// 把反转后的Map转为普通JavaScript对象
const reversedObj = Object.fromEntries(reversedMap);

console.log(reversedObj);
// 输出结果:
// { '1': [ 'Croatia', 'Korea', 'Munich', 'Australia' ], '2': [ 'Norway' ] }

方案二:直接交换(会丢失重复键数据)

如果你不在意数据丢失,只是想快速交换(但不推荐,因为会丢掉大部分数据),可以这么写:

const originalMap = new Map([
  ["Croatia", 1],
  ["Korea", 1],
  ["Norway", 2],
  ["Munich", 1],
  ["Australia", 1]
]);

const reversedObj = {};
originalMap.forEach((value, key) => {
  reversedObj[value] = key;
});

console.log(reversedObj);
// 输出结果:
// { '1': 'Australia', '2': 'Norway' }
// 注意:前面的Croatia、Korea、Munich都被最后一个Australia覆盖了!

为什么推荐方案一?

因为原Map里存在多个键对应同一个值的情况,普通对象无法用同一个键存储多个值,用数组收集是最合理的方式,能完整保留所有原始数据的对应关系。

内容的提问来源于stack exchange,提问作者Yefet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:47:50