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

如何在Angular中归约对象数组并对同名属性值求和

实现方案

你可以直接使用TypeScript/JavaScript原生的Array.reduce方法完成分组归约,该方法在所有Angular版本中都可以直接使用,无需引入额外依赖:

// 原始数组
const tab = [{name:'i', value:13}, {name:'j', value:10},{name:'i', value:8}];

// 按name属性分组累加value
const sumResult = tab.reduce((acc, current) => {
  const existedItem = acc.find(item => item.name === current.name);
  if (existedItem) {
    existedItem.value += current.value;
  } else {
    acc.push({...current});
  }
  return acc;
}, [] as {name: string, value: number}[]);

// 赋值给原变量即可得到预期结果
tab = sumResult;

如果你希望获得更高的执行效率,也可以先通过映射对象做中间存储再转换格式:

const tab = [{name:'i', value:13}, {name:'j', value:10},{name:'i', value:8}];

// 用对象做中间映射,查找效率更高
const tempMap = tab.reduce((map, item) => {
  map[item.name] = (map[item.name] || 0) + item.value;
  return map;
}, {} as Record<string, number>);

// 转换为目标数组格式
tab = Object.entries(tempMap).map(([name, value]) => ({ name, value }));

如果需要复用该逻辑,可以封装为通用工具方法:

function groupSumByName(arr: {name: string, value: number}[]) {
  const tempMap = arr.reduce((map, item) => {
    map[item.name] = (map[item.name] || 0) + item.value;
    return map;
  }, {} as Record<string, number>);
  return Object.entries(tempMap).map(([name, value]) => ({ name, value }));
}

// 调用示例
const tab = groupSumByName([{name:'i', value:13}, {name:'j', value:10},{name:'i', value:8}]);

内容的提问来源于stack exchange,提问作者Mariem

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 23:51:04