如何最优合并数组?解决现有代码缺失非data1索引元素问题
如何合并多个数组并保留所有元素(按
name字段匹配) 你的问题核心是原代码只遍历了data1,导致data2、data3中name不在data1里的元素全部丢失。要高效解决这个问题,用Map按name做键值对映射是最优方案,既能避免多次遍历查找的性能损耗,又能自然保留所有存在于任意数组中的元素。
实现思路
- 先把
data1的元素存入Map,以name为键,值为元素的拷贝(避免修改原数组) - 遍历
data2:- 若
Map中已有对应name,则累加value并补上type字段 - 若没有,直接将该元素加入
Map
- 若
- 遍历
data3:- 若
Map中已有对应name,累加value - 若没有,直接加入
Map
- 若
- 最后将
Map的所有值转换为数组,就是合并后的结果
完整代码
const data1 = [ {name:'aa', value: 1}, {name:'bb', value: 33}, ] const data2 = [ {name:'aa', value: 11, type:'test1'}, {name:'bb', value: 22, type:'test2'}, {name:'cc', value: 55, type:'test3'} ] const data3 = [ {name:'aa', value: 100}, {name:'bb', value: 200}, {name:'cc', value: 300}, {name:'dd', value: 300}, {name:'ee', value: 300} ]; // 初始化Map,存入data1的元素(拷贝避免修改原数组) const mergedMap = new Map(); data1.forEach(item => { mergedMap.set(item.name, {...item}); }); // 处理data2 data2.forEach(item => { if (mergedMap.has(item.name)) { const existing = mergedMap.get(item.name); existing.value += item.value; existing.type = item.type; } else { mergedMap.set(item.name, {...item}); } }); // 处理data3 data3.forEach(item => { if (mergedMap.has(item.name)) { const existing = mergedMap.get(item.name); existing.value += item.value; } else { mergedMap.set(item.name, {...item}); } }); // 转换为数组 const result = Array.from(mergedMap.values()); console.log('合并结果: ', result);
为什么这个方案更好
- 性能更优:
Map的查找和插入操作都是O(1),整体时间复杂度为O(m+n+p)(m、n、p分别是三个数组的长度),远优于原方案中多次调用findIndex带来的O(m*(n+p))时间复杂度 - 自动保留所有元素:不需要额外判断哪些元素需要插入,遍历过程中自然将所有数组的元素都纳入合并范围
- 避免修改原数组:通过对象拷贝
{...item}操作,不会改变原始的data1、data2、data3数组
内容的提问来源于stack exchange,提问作者Qwertycal
相关产品推荐
相关产品推荐

