如何合并JavaScript对象中asset_id和event_code重复项的value值
JavaScript 合并相同asset_id和event_code的对象并累加value
你的现有代码仅对比相邻元素的asset_id和event_code,但相同组合的对象可能并非连续排列(比如示例中第一个和最后一个对象都是ABC+1),因此无法正确合并所有符合条件的对象,导致结果不符合预期。
正确实现方式
使用临时对象做映射,将asset_id与event_code的组合作为唯一键,遍历数组时累加对应组合的value,最后将映射转为目标数组:
const transaction = [{ value: 5, asset_id: 'ABC', event_code : 1 }, { value: 15, asset_id: 'HGF', event_code : 1 }, { value: 15, asset_id: 'XYZ', event_code : 2 }, { value: 20, asset_id: 'XYZ', event_code : 2 }, { value: 25, asset_id: 'DEF', event_code : 3 }, { value: 20, asset_id: 'HGF', event_code : 3 }, { value: 20, asset_id: 'HGF', event_code : 3 }, { value: 10, asset_id: 'ABC', event_code : 1 }]; const map = {}; transaction.forEach(item => { const key = `${item.asset_id}-${item.event_code}`; if (map[key]) { map[key].value += item.value; } else { map[key] = {...item}; } }); const newArr = Object.values(map); console.log(newArr);
代码说明
- 生成唯一键:通过
${item.asset_id}-${item.event_code}创建唯一标识,确保每个asset_id+event_code组合对应唯一的映射键。 - 累加value:遍历数组时,若键已存在则累加
value;若不存在则浅拷贝原对象存入映射(避免修改原数组数据)。 - 转换为数组:使用
Object.values(map)提取映射中的所有值,得到合并后的结果数组。
执行后输出与期望结果一致:
[{ value: 15, asset_id: 'ABC', event_code: 1 }, { value: 15, asset_id: 'HGF', event_code: 1 }, { value: 35, asset_id: 'XYZ', event_code: 2 }, { value: 25, asset_id: 'DEF', event_code: 3 }, { value: 40, asset_id: 'HGF', event_code: 3 }]
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

