合并对象数组:累加相同日期对象的金额
合并同一日期的对象并计算金额总和
嘿,这个需求在日常数据处理里太常见了!我给你分享两种实用的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
相关产品推荐
相关产品推荐

