如何遍历JavaScript Map并将值相同的键归入同一数组?
问题解决:JavaScript Map按值分组键为数组
我有一个如下结构的JavaScript Map:
let map = new Map([ [3, 1], [15, 2], [0, 2], [8, 3], [9, 3] ]);
需要得到由键组成的数组,要求值相同的键归入同一数组,期望输出:
[[3], [15, 0], [8, 9]]
我尝试了以下代码,但返回结果是[[3], [15], [8]],不符合预期:
let answers = []; let currentVal = 1; map.forEach((value, key)=>{ let subArr = []; if(value === currentVal){ subArr.push(key); answers.push(subArr); currentVal++; } }); return answers;
错误原因分析
你的代码逻辑存在两个核心问题:
- 每次
forEach循环都会创建新的subArr,同值的键无法被推入同一个数组; - 匹配到一个值后立刻执行
currentVal++,后续同值的键(比如0的value是2,此时currentVal已变成3)无法再匹配,因此被遗漏。
正确实现方案
正确思路是先按值分组,用临时容器存储每个值对应的键数组,最后提取这些数组即可:
方案一:使用普通对象作为中间容器
let map = new Map([ [3, 1], [15, 2], [0, 2], [8, 3], [9, 3] ]); const groupByValue = {}; map.forEach((value, key) => { // 若当前值无对应数组,先初始化空数组 if (!groupByValue[value]) { groupByValue[value] = []; } // 将键推入对应值的数组 groupByValue[value].push(key); }); // 提取对象中的所有数组,得到最终结果 const answers = Object.values(groupByValue); console.log(answers); // 输出 [[3], [15, 0], [8, 9]]
方案二:使用Map作为中间容器(顺序更严谨)
如果需要严格保持原Map中value的出现顺序,用Map作为中间容器更稳妥:
let map = new Map([ [3, 1], [15, 2], [0, 2], [8, 3], [9, 3] ]); const groupByValue = new Map(); map.forEach((value, key) => { if (!groupByValue.has(value)) { groupByValue.set(value, []); } groupByValue.get(value).push(key); }); const answers = Array.from(groupByValue.values()); console.log(answers); // 输出 [[3], [15, 0], [8, 9]]
内容的提问来源于stack exchange,提问作者Jenya Rusinova
相关产品推荐
相关产品推荐

