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

基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:25:11