如何高效合并不同长度的对象数组并按ID合并重复项
高效合并两个对象数组(按ID累加value)
现有两个对象数组:
const arr1 = [ {id:1, value:25}, {id:2, value:15}, {id:3, value:35} ]; const arr2 = [ {id:3, value:95}, {id:4, value:65} ];
需要生成第三个数组,要求包含所有唯一ID的对象;ID重复时,保留ID并将对应value值相加,最终结果如下:
const arr3 = [ {id:1, value:25}, {id:2, value:15}, {id:3, value:130}, {id:4, value:65}, ];
最高效的实现方式是利用Map数据结构,因为Map的查找、插入操作时间复杂度都是O(1),整体时间复杂度为O(n + m)(n和m分别是两个数组的长度),远优于双重循环的O(n*m)。
具体实现代码
function mergeArrays(arr1, arr2) { const valueMap = new Map(); // 处理第一个数组 arr1.forEach(item => { valueMap.set(item.id, (valueMap.get(item.id) || 0) + item.value); }); // 处理第二个数组 arr2.forEach(item => { valueMap.set(item.id, (valueMap.get(item.id) || 0) + item.value); }); // 将Map转换为目标数组 return Array.from(valueMap, ([id, value]) => ({ id, value })); } // 调用示例 const arr1 = [ {id:1, value:25}, {id:2, value:15}, {id:3, value:35} ]; const arr2 = [ {id:3, value:95}, {id:4, value:65} ]; const arr3 = mergeArrays(arr1, arr2); console.log(arr3); // 输出:[{id:1, value:25}, {id:2, value:15}, {id:3, value:130}, {id:4, value:65}]
代码说明
- 用
Map存储每个ID对应的value总和,避免重复遍历查找 - 遍历两个数组时,通过
valueMap.get(item.id) || 0处理ID首次出现的情况,简化判断逻辑 - 最后用
Array.from将Map的键值对直接转换为目标格式的对象数组,简洁高效
内容的提问来源于stack exchange,提问作者Billies Wesley
相关产品推荐
相关产品推荐

