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

如何高效合并JavaScript对象:相同键数组合并,新增键保留?

如何高效合并两个包含数组属性的JavaScript对象?

问题背景

给定两个JavaScript对象:

const obj1 = {
  a: [{asd1: 1}, {asd2: 2}, {asd3: 3}]
};

const obj2 = {
  a: [{asd4: 4}],
  b: [{a: "asd"}, {b: "asd"}]
};

需要合并为如下结果:

const obj3 = {
  a: [{asd1: 1}, {asd2: 2}, {asd3: 3}, {asd4: 4}],
  b: [{a: "asd"}, {b: "asd"}]
};

核心需求是:同名属性若为数组则合并,非数组属性直接取第二个对象的值。


高效实现方案

1. 通用场景(未知对象结构)

如果需要处理任意结构的对象,且要保证不修改原对象,这个函数是高效且通用的选择:

function mergeArrayObjects(target, source) {
  // 先浅拷贝target作为合并基础,避免修改原对象
  const merged = { ...target };
  
  // 遍历source的所有可枚举属性
  for (const key in source) {
    if (source.hasOwnProperty(key)) {
      const targetVal = merged[key];
      const sourceVal = source[key];
      
      // 仅当两边属性都是数组时,执行合并
      if (Array.isArray(targetVal) && Array.isArray(sourceVal)) {
        // 用展开运算符合并数组,原生优化性能优异
        merged[key] = [...targetVal, ...sourceVal];
        // 若追求内存效率(避免创建新数组),可改用push:
        // merged[key].push(...sourceVal);
      } else {
        // 非数组属性直接覆盖为source的值
        merged[key] = sourceVal;
      }
    }
  }
  
  return merged;
}

// 调用示例
const obj3 = mergeArrayObjects(obj1, obj2);

效率说明:

  • 时间复杂度为O(n + k),n是对象属性数量,k是所有数组的元素总数,这是理论最优复杂度(必须遍历所有要合并的元素)
  • 利用原生展开运算符/push方法,都是V8引擎高度优化的操作,性能远超手动循环拼接
  • 仅遍历source的属性,避免多余的计算

2. 特定场景(已知对象结构)

如果已经明确对象的属性结构,直接写出合并逻辑是最高效的——没有额外循环和判断,完全是原生赋值操作:

const obj3 = {
  // 直接合并数组
  a: [...obj1.a, ...obj2.a],
  // 展开obj2的其他属性
  ...obj2
};

效率说明:

  • 没有任何循环或条件判断,执行速度最快
  • 代码简洁直观,适合结构固定的场景

内容的提问来源于stack exchange,提问作者Eedma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 13:17:30