基于family属性去重并累加total属性的数组处理求助
数组对象按family去重并累加total的解决方案
需求回顾
你需要对数组对象按family属性去重,同时将重复项的total属性求和:
原始数组:
[{family: "Mobile",total:30}, {family: "Mobile",total:20}, {family: "Mobile",total:50}, {family: "Laptop",total:20}]
期望结果:
[{family: "Mobile",total:100}, {family: "Laptop",total:20}]
原代码问题分析
你当前的代码仅实现了去重逻辑,但未处理total累加:当检测到结果数组中已有相同family的对象时,直接跳过了当前项,没有对已存在对象的total进行数值更新。
修正方案1:基于原reduce逻辑优化
直接在原代码基础上修改,遍历过程中检测到重复项时累加total:
var resultArray = this.list1.reduce((unique, o) => { // 查找结果数组中是否已有相同family的对象 const existingItem = unique.find(obj => obj.family === o.family); if (existingItem) { // 存在则累加total existingItem.total += o.total; } else { // 不存在则添加新对象(用扩展运算符拷贝,避免修改原数组对象) unique.push({ ...o }); } return unique; }, []); console.log(resultArray);
修正方案2:用对象缓存提升性能(推荐大数据量场景)
先通过对象缓存每个family对应的total总和,再转换为目标数组格式,这种方式查找效率更高:
// 第一步:生成family到累计total的映射对象 const totalMap = this.list1.reduce((map, item) => { map[item.family] = (map[item.family] || 0) + item.total; return map; }, {}); // 第二步:将映射对象转换为目标数组结构 const resultArray = Object.entries(totalMap).map(([family, total]) => ({ family, total })); console.log(resultArray);
两种方案说明
- 方案1逻辑直观,适合小体量数组;
- 方案2利用对象键查找的O(1)特性,在数组元素较多时性能更优,同时代码更简洁。
内容的提问来源于stack exchange,提问作者Gajini
相关产品推荐
相关产品推荐

