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

如何最优合并数组?解决现有代码缺失非data1索引元素问题

如何合并多个数组并保留所有元素(按name字段匹配)

你的问题核心是原代码只遍历了data1,导致data2、data3中name不在data1里的元素全部丢失。要高效解决这个问题,用Map按name做键值对映射是最优方案,既能避免多次遍历查找的性能损耗,又能自然保留所有存在于任意数组中的元素。

实现思路

  1. 先把data1的元素存入Map,以name为键,值为元素的拷贝(避免修改原数组)
  2. 遍历data2:
    • 若Map中已有对应name,则累加value并补上type字段
    • 若没有,直接将该元素加入Map
  3. 遍历data3:
    • 若Map中已有对应name,累加value
    • 若没有,直接加入Map
  4. 最后将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:01:02