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

如何遍历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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 06:45:32