JS Array Reduce实现多键匹配对象计数及cat/subCat嵌套分组
数组分组计数去重实现方案
你可以直接使用如下修改后的reduce逻辑,即可满足需求:
const formatedObjects = Object.values(objects.reduce((acc, item) => { const { cat, subCat } = item; // 提取当前项用于匹配的三个关键字段 const matchName = item.name; const matchShadowColor = item.shadowColor ?? null; const matchWattageVal = item.wattage?.value ?? null; // 初始化cat层级分组 if (!acc[cat]) { acc[cat] = { cat, children: [] } } // 查找当前cat下对应的subCat分组 let subGroup = acc[cat].children.find(g => g.subCat === subCat); // 不存在则新增subCat分组 if (!subGroup) { subGroup = { subCat, children: [] }; acc[cat].children.push(subGroup); } // 在subCat分组内查找三个字段完全匹配的已有条目 const existItem = subGroup.children.find(i => { return i.name === matchName && i.shadowColor === matchShadowColor && i.wattage?.value === matchWattageVal }); if (existItem) { // 匹配到已有条目直接累加计数 existItem.count += 1; } else { // 无匹配条目则新增,count初始值为1 subGroup.children.push({ cat, subCat, name: matchName, title: item.title, shadowColor: matchShadowColor, wattage: item.wattage ?? null, count: 1 }) } return acc; }, {}))
核心修改说明
- 新增内层匹配逻辑:在subCat分组的children中,按
name、shadowColor、wattage.value三个字段匹配已有条目,避免重复生成对象,匹配成功直接累加count字段 - 补全了内层对象缺失的
cat、subCat字段,和预期输出结构完全对齐 - 最后通过
Object.values()将reduce生成的分组对象转换为数组,符合你要求的最终输出格式 - 使用空值合并运算符
??简化了空值兜底判断逻辑
内容的提问来源于stack exchange,提问作者Kartik Solanki
相关产品推荐
相关产品推荐

