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

如何按address属性聚合对象数组并求和amount?是否用reduce?

按address分组并求和amount属性的实现方案

是的,Array.reduce() 是处理这类数组分组聚合需求的绝佳选择,它能高效地将原数组转换为按address分组、包含totalAmount的新数组。

实现代码示例

假设原数组如下(补充具体的其他属性示例):

const originalArray = [
  { amount: 10, address: 'a01', name: 'Alice' },
  { amount: 20, address: 'b02', name: 'Bob' },
  { amount: 5, address: 'a01', name: 'Alice' },
  { amount: 15, address: 'b02', name: 'Bob' }
];

使用reduce实现分组求和的代码:

const groupedResult = Object.values(
  originalArray.reduce((groupMap, item) => {
    // 检查当前address是否已在分组映射中
    if (!groupMap[item.address]) {
      // 初始化分组对象:复制原属性,将amount转为totalAmount
      groupMap[item.address] = {
        ...item,
        totalAmount: item.amount
      };
      // 移除原amount属性(可选,根据需求决定是否保留)
      delete groupMap[item.address].amount;
    } else {
      // 已存在则累加totalAmount
      groupMap[item.address].totalAmount += item.amount;
    }
    return groupMap;
  }, {}) // 初始累加器是一个空对象
);

console.log(groupedResult);

代码逻辑说明

  1. reduce的累加器:用一个对象groupMap存储分组结果,键为address的值,值为对应的分组对象。
  2. 遍历处理每个元素:
    • 如果当前address不在groupMap中,就创建新的分组对象,复制原元素的所有属性,并将amount赋值给totalAmount。
    • 如果address已存在,直接对该分组的totalAmount进行累加。
  3. 转换为目标数组:通过Object.values()将groupMap的所有值提取出来,形成最终的数组结构。

特殊情况处理

如果同一address对应的其他属性存在差异(比如不同元素的name不同),可以根据需求调整逻辑:

  • 保留第一个元素的属性
  • 合并所有属性(如用Object.assign)
  • 收集所有不同的属性值到数组中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:15:41