如何高效合并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
相关产品推荐
相关产品推荐

