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

如何在JavaScript中基于枚举值对Map数据按指定类别分组排序

代码调整方案

原有代码错误点

  • 未给reduce传入初始累加对象,会默认把数组第一个元素作为初始值,逻辑完全错误
  • 遍历Map拿到的metric是[状态名, 数值]格式的数组,直接当作key去metricGroups中查找肯定返回undefined,触发push报错
  • reduce回调未返回累加器acc,每轮迭代后累加器会变为undefined,后续操作直接报错

实现代码

提前将分组配置转成查找映射表,避免每次遍历都要循环数组匹配分组,性能更优:

// 构建状态→分组、状态→输出小写key的映射表
const statusMap = {}
Object.entries(metricGroups).forEach(([groupKey, statusList]) => {
  // 适配你期望的输出分组名unadopted,把驼峰的unAdopted转成全小写
  const outputGroupKey = groupKey === 'unAdopted' ? 'unadopted' : groupKey
  statusList.forEach(status => {
    statusMap[status] = {
      group: outputGroupKey,
      // 状态名首字母转小写,匹配你要的输出格式
      outputStatus: status.charAt(0).toLowerCase() + status.slice(1)
    }
  })
})

const GroupedData = Array.from(animalData).reduce((acc, [status, count]) => {
  const match = statusMap[status]
  if (match) {
    acc[match.group].push([match.outputStatus, count])
  }
  return acc
// 初始化累加器结构和你要的输出完全匹配
}, {
  adopted: [],
  unadopted: [],
  unknown: []
})

如果不想提前构建映射表,也可以直接在reduce中做分组匹配,适合数据量小的场景:

const GroupedData = Array.from(animalData).reduce((acc, [status, count]) => {
  for (const [groupKey, statusList] of Object.entries(metricGroups)) {
    if (statusList.includes(status)) {
      // 处理分组名输出
      const outputGroupKey = groupKey === 'unAdopted' ? 'unadopted' : groupKey
      // 处理状态名输出
      const outputStatus = status.charAt(0).toLowerCase() + status.slice(1)
      acc[outputGroupKey].push([outputStatus, count])
      break
    }
  }
  return acc
}, {
  adopted: [],
  unadopted: [],
  unknown: []
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:51:03