js中数组的合并和对象的合并

本文详细介绍JavaScript中数组与对象的多种合并方法,包括concat、push.apply、$.extend、Object.assign等,以及深拷贝与浅拷贝的区别。通过实例演示,帮助读者掌握不同场景下最合适的合并方式。

转自:https://www.cnblogs.com/xingxiangyi/p/6416468.html

1 数组合并

1.1 concat 方法

var a=[1,2,3],b=[4,5,6];
var c=a.concat(b);
console.log(c);// 1,2,3,4,5,6
console.log(a);// 1,2,3  不改变本身

1.2 循环遍历

var arr1=['a','b'];
var arr2=['c','d','e'];

for(var i=0;i<arr2.length;i++){
      arr1.push(arr2[i]) 
}

console.log(arr1);//['a','b','c','d','e']

1.3 apply

合并数组arr1和数组arr2,使用Array.prototype.push.apply(arr1,arr2) or arr1.push.apply(arr1,arr2);

var arr1=['a','b'];
var arr2=['c','d','e'];

Array.prototype.push.apply(arr1,arr2);

//或者

arr1.push.apply(arr1,arr2);<br>console.log(arr1) //['a','b','c','d','e']

2 对象合并

2.1 $.extend()

var obj1= {'a': 1};
var obj2= {'b': 1};
var c = $.extend(obj1, obj2);

console.log(obj1); // {a: 1, b: 1}  obj1已被修改

//或者 <br>var obj3 = $.extend({}, obj1, obj2) <br>console.log(obj3); //{a: 1, b: 1} 不会改变obj1,obj2
  •  

2.2 遍历赋值

var obj1={'a':1};
var obj2={'b':2,'c':3};
for(var key in obj2){
     if(obj2.hasOwnProperty(key)===true){    <br>     //此处hasOwnProperty是判断自有属性,使用 for in 循环遍历对象的属性时,原型链上的所有属性都将被访问会避免原型对象扩展带来的干扰
           obj1[key]=obj2[key];
} 
}

console.log(obj1);//{'a':1,'b':2,'c':3};
  •  

2.3 Obj.assign()

可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。

  Object.assign(target, …sources)

//a. 复制一个对象<br>var obj = { a: 1 ,b:2};
var copyObj = Object.assign({}, obj);
console.log(copyObj); // { a: 1,b:2 }<br><br>//b.合并多个对象

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, 且目标对象自身也会改变。
  •  

2.4 对象的深拷贝和浅拷贝

2.4.1 浅拷贝

var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};

$.extend(obj1, obj2);   //obj1拷贝了obj2的属性

console.log(obj1)  // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1)  // 22

obj2.b.b1=44;   //obj2重新赋值
console.log(obj1.b.b1)  // 44  obj1.b仅拷贝了对象的指引,所以受原obj2的影响

2.4.2 深拷贝

var obj1={'a':1};
var obj2={'b':{'b1':22,'b2':33}};

$.extend(true,obj1, obj2);   //第一个参数设为true表示深复制

console.log(obj1)  // {'a':1,'b'{'b1':22,'b2':33}}
console.log(obj1.b.b1)  // 22

obj2.b.b1=44;   //obj2重新赋值
console.log(obj1.b.b1)  // 22 obj1拷贝了obj2的所有属性以及值,并不受obj2的影响
<think> 我们需要合并多个数组对象,这里可能有两种情况: 1. 合并多个数组(即数组的拼接) 2. 合并多个对象数组合并通常指数组拼接,但如果是数组中的对象元素,可能是指对象合并) 但根据问题“数组对象合并”,可能是指: - 情况1:将多个数组合并成一个数组(拼接) - 情况2:将数组中的多个对象合并成一个对象对象属性合并) 由于问题描述不是很清晰,这里我将分别给出两种情况的解决方案。 情况1:数组拼接 在JavaScript中,可以使用多种方法实现多个数组的拼接: - 使用concat方法 - 使用展开运算符(...) - 使用循环push 情况2:数组合并对象(将数组内多个对象合并成一个对象) 例如:将 [{a:1}, {b:2}, {c:3}] 合并成 {a:1, b:2, c:3} 可以使用Object.assign或者使用reduce方法,或者展开运算符。 由于问题没有明确,我将分别给出示例。 首先,我们来看数组拼接(多个数组合并成一个数组): </think> 在JavaScript中,数组对象合并通常涉及两种场景:**数组的拼接**(合并多个数组元素)**对象合并**(合并数组中的对象元素)。以下是详细解决方案: --- ### 场景1:多个数组合并(拼接) 将多个数组合并成一个新数组: ```javascript // 方法1:concat() const arr1 = [1, 2]; const arr2 = ['a', 'b']; const mergedArray = arr1.concat(arr2); console.log(mergedArray); // [1, 2, 'a', 'b'] // 方法2:展开运算符(推荐) const mergedArray2 = [...arr1, ...arr2]; console.log(mergedArray2); // [1, 2, 'a', 'b'] ``` **解释**: - `concat()` 返回新数组,不改变原数组 - 展开运算符 `...` 更简洁,支持嵌套数组展开 - 两者都是浅拷贝(嵌套对象仍共享引用) --- ### 场景2:数组对象合并数组中的多个对象合并成一个新对象: ```javascript const users = [ { id: 1, name: "Alice" }, { age: 25, role: "admin" }, { country: "USA" } ]; // 方法1:Object.assign() const mergedObject = Object.assign({}, ...users); console.log(mergedObject); // { id:1, name:"Alice", age:25, role:"admin", country:"USA" } // 方法2:reduce() const mergedObject2 = users.reduce((acc, obj) => ({...acc, ...obj}), {}); console.log(mergedObject2); // 同上 // 方法3:展开运算符 const mergedObject3 = {...users[0], ...users[1], ...users[2]}; console.log(mergedObject3); // 同上 ``` **关键点**: 1. `Object.assign()` 第一个参数是目标对象(空对象`{}`避免修改原数组) 2. `reduce()` 遍历数组逐步合并,初始值为空对象 3. **同名属性会被覆盖**(后面对象的属性覆盖前面的) 4. 所有方法都是浅合并(嵌套对象需递归处理) --- ### ⚠️ 处理深合并(嵌套对象) 当对象包含嵌套结构时,需递归合并: ```javascript function deepMerge(target, source) { for (const key in source) { if (source[key] instanceof Object && target[key]) { deepMerge(target[key], source[key]); } else { target[key] = source[key]; } } return target; } const obj1 = { a: 1, b: { x: 10 } }; const obj2 = { b: { y: 20 }, c: 3 }; const merged = deepMerge({...obj1}, obj2); console.log(merged); // { a:1, b:{x:10, y:20}, c:3 } ``` **说明**: - 递归检查属性是否为对象 - 保留原始对象的嵌套属性(如`b.x`未被覆盖) - 使用 `{...obj1}` 创建副本避免修改原对象 --- ### 性能注意事项 | 方法 | 适用场景 | 特点 | |---------------|----------------------|--------------------------| | `concat()` | 大型数组拼接 | 内存效率高 | | 展开运算符 | 中小型数组/对象 | 语法简洁,易读 | | `Object.assign()` | 对象合并 | 直接操作对象属性 | | `reduce()` | 动态数组合并 | 灵活处理合并逻辑 | --- ### 常见问题解决 **Q:如何避免对象合并时的引用共享?** A:使用深拷贝后再合并: ```javascript const deepMerged = deepMerge( JSON.parse(JSON.stringify(obj1)), JSON.parse(JSON.stringify(obj2)) ); ``` **注意**:`JSON`方法无法处理函数、`undefined`等特殊类型。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值