如何合并对象数组中重复asset_id对应的total_duration值
解决对象数组中重复asset_id的total_duration求和问题
你的代码逻辑只处理了相邻的重复asset_id,一旦相同id的元素被其他条目隔开,就无法正确合并求和。比如示例中的ABC和HGF条目都是分散的,所以最终结果里会保留多个相同id的条目,求和不完整。
正确解法:用临时映射存储累加结果
可以用对象或Map作为中间容器,遍历数组时累加每个asset_id对应的total_duration,最后再将映射转换为目标数组。
方法1:使用普通对象
const transaction = [{ total_duration: 5, asset_id: 'ABC', }, { total_duration: 15, asset_id: 'HGF', }, { total_duration: 15, asset_id: 'XYZ', }, { total_duration: 20, asset_id: 'XYZ', }, { total_duration: 25, asset_id: 'DEF', }, { total_duration: 20, asset_id: 'HGF', }, { total_duration: 20, asset_id: 'HGF', }, { total_duration: 10, asset_id: 'ABC', }]; // 存储每个asset_id的总时长 const durationMap = {}; transaction.forEach(item => { // 若已存在则累加,否则初始化 durationMap[item.asset_id] = (durationMap[item.asset_id] || 0) + item.total_duration; }); // 将映射转换为目标数组 const newArr = Object.entries(durationMap).map(([asset_id, total_duration]) => ({ asset_id, total_duration })); console.log(newArr);
方法2:使用Map(保留插入顺序)
如果需要保留原数组中asset_id首次出现的顺序,用Map更直观:
const durationMap = new Map(); transaction.forEach(item => { const currentTotal = durationMap.get(item.asset_id) || 0; durationMap.set(item.asset_id, currentTotal + item.total_duration); }); // 将Map转换为数组 const newArr = Array.from(durationMap, ([asset_id, total_duration]) => ({ asset_id, total_duration })); console.log(newArr);
原代码问题分析
你原来的forEach逻辑只对比当前元素和下一个元素的asset_id:
- 只有当当前元素和下一个元素id不同,或者是最后一个元素时,才会push到新数组
- 如果相同id的元素不相邻(比如
ABC的两个条目被其他元素隔开),就会被当成独立条目加入数组,无法完成跨条目求和
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

