如何基于交换键值后的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
相关产品推荐
相关产品推荐

