合并数组中重复对象并对results值求和的实现方法
实现思路与代码示例
核心就是用reduce做分组累加,步骤如下:
- 初始化一个空对象作为累加器,用来按
team存储合并后的结果 - 遍历数组中的每个对象:
- 取出当前对象的
team和results - 如果累加器中已有该
team的记录,就把results里的每个字段(passed、failed等)和已有记录的对应字段相加 - 如果没有该
team的记录,就创建一个新对象存入累加器,结构和原数组对象一致
- 取出当前对象的
- 最后把累加器的所有值提取出来,就是合并后的数组
代码实现
// 示例原数组 const originalArray = [ { team: "Team A", results: { passed: 5, failed: 1, flaky: 0, skipped: 2, timedOut: 0 } }, { team: "Team B", results: { passed: 3, failed: 2, flaky: 1, skipped: 0, timedOut: 1 } }, { team: "Team A", results: { passed: 4, failed: 0, flaky: 2, skipped: 1, timedOut: 0 } }, { team: "Team C", results: { passed: 7, failed: 0, flaky: 0, skipped: 0, timedOut: 0 } }, { team: "Team B", results: { passed: 2, failed: 1, flaky: 0, skipped: 3, timedOut: 0 } } ]; const mergedArray = Object.values(originalArray.reduce((acc, current) => { const { team, results } = current; // 如果当前team已存在,累加results字段 if (acc[team]) { acc[team].results.passed += results.passed; acc[team].results.failed += results.failed; acc[team].results.flaky += results.flaky; acc[team].results.skipped += results.skipped; acc[team].results.timedOut += results.timedOut; } else { // 不存在则创建新条目,浅拷贝results避免修改原数组 acc[team] = { team, results: { ...results } }; } return acc; }, {})); console.log(mergedArray);
灵活优化点
如果results里的字段可能后续新增,不想硬写每个字段名,可以用Object.keys()遍历results的键来动态累加,避免漏字段:
// 替换累加部分的代码 if (acc[team]) { Object.keys(results).forEach(key => { acc[team].results[key] += results[key]; }); }
这样不管后续results新增什么数值字段,都能自动处理。
内容的提问来源于stack exchange,提问作者Skorp
相关产品推荐
相关产品推荐

