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

如何合并对象数组中重复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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 12:55:25