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

合并对象数组:累加相同日期对象的金额

合并同一日期的对象并计算金额总和

嘿,这个需求在日常数据处理里太常见了!我给你分享两种实用的JavaScript实现方式,高效又易懂:

方法一:使用Array.reduce()(推荐)

这是最简洁的实现方式,利用reduce构建日期到总金额的映射,最后转成目标数组:

const originalArray = [
  { date: '2024-05-01', amount: 100 },
  { date: '2024-05-01', amount: 200 },
  { date: '2024-05-02', amount: 150 },
  { date: '2024-05-03', amount: 50 },
  { date: '2024-05-02', amount: 75 }
];

const mergedArray = Object.values(
  originalArray.reduce((acc, current) => {
    // 若当前日期已在累加器中,累加金额
    if (acc[current.date]) {
      acc[current.date].amount += current.amount;
    } else {
      // 若不存在,复制当前对象存入累加器(避免修改原数组)
      acc[current.date] = { ...current };
    }
    return acc;
  }, {})
);

console.log(mergedArray);
// 输出结果:
// [
//   { date: '2024-05-01', amount: 300 },
//   { date: '2024-05-02', amount: 225 },
//   { date: '2024-05-03', amount: 50 }
// ]

代码说明:

  • reduce()遍历原数组,以空对象{}作为初始累加器acc;
  • 每处理一个对象,检查日期是否已存在于累加器:存在则累加金额,不存在则新增对象;
  • 最后用Object.values()提取累加器的value值,转成我们需要的数组格式。

方法二:使用普通循环(适合新手理解)

如果觉得reduce有点抽象,用forEach循环也能实现,逻辑更直观:

const originalArray = [/* 你的数组数据 */];
const dateMap = {};

originalArray.forEach(item => {
  if (dateMap[item.date]) {
    dateMap[item.date].amount += item.amount;
  } else {
    dateMap[item.date] = { ...item };
  }
});

const mergedArray = Object.values(dateMap);

这个逻辑和reduce完全一致,只是用forEach替代了reduce,步骤更清晰,适合刚接触数组方法的朋友。

注意事项

  • 如果你的日期是Date对象而非字符串,记得先转成统一的字符串格式(比如item.date.toISOString().split('T')[0]),否则相同日期的不同Date实例会被当成不同key;
  • 使用...item复制对象是为了避免修改原数组元素,若不需要保留原数组,也可以直接赋值dateMap[item.date] = item,但不推荐,容易引发意外的引用问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:12:24