如何在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
相关产品推荐
相关产品推荐

