对象合并有三种方式:
- jQuery.extend()方法
- 遍历赋值法
- Object.assign()方法
1.jQuery.extend()方法
语法:
$.extend( [deep ], target, object1 [, objectN ] )
参数介绍:
参 数 详细介绍 | 描述 |
---|---|
deep | 可选。 Boolean类型 指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个同名属性也都是对象,则该"属性对象"的属性也将进行合并。即对象中的对象也要进行合并 |
target | Object类型 目标对象,其他对象的成员属性将被附加到该对象上。 |
object1 | 可选。 Object类型 第一个被合并的对象。 |
objectN | 可选。 Object类型 第N个被合并的对象。 |
常见的用法:
var res = $.extend({},object1,object2);
var res = $.extend(true,{},object1,object2);
- 这种写法的好处是,不改变现有的对象,重新生成一个合并后的新对象
关于深拷贝和浅拷贝,举个栗子:
var object1 = {
apple: 0,
banana: {weight: 52, price: 100},
cherry: 97
};
var object2 = {
banana: {price: 200},
durian: 100
};
var res = $.extend(true,{},object1,object2);
//打印出的结果是:
res = {
apple: 0,
banana: {weight: 52, price: 200},
cherry: 97,
durian: 100
};
var res2 = $.extend({},object1,object2);
//结果是:
res2 = {
apple: 0,
banana: { price: 200},
cherry: 97,
durian: 100
};
浅拷贝的实质:
shallowCopy (o) {
let object2 = {}
for(let i in o) {
if (o.hasOwnProperty(i)) {
object2[i] = o[i]
}
}
return object2
}
深拷贝:
deepCopy (o, c) {
c = c || {}
for (let i in o) {
if (typeof o[i] === 'object') {
// 需要深拷贝
if (o[i].constructor === Array) {
// 数组
console.log('是数组')
c[i] = []
} else {
// 对象
console.log('是对象')
c[i] = {}
}
this.deepCopy(o[i], c[i])
} else {
c[i] = o[i]
}
}
return c
}
经常会遇到在不影响原对象的情况下拷贝一个对象:
const obj1 = JSON.parse(JSON.stringify(obj));
也经常会遇到在不影响原数组的情况下拷贝一个数组:
const arr1 = arr.slice() ;
理解js中的深拷贝与浅拷贝:https://blog.youkuaiyun.com/qq_34664239/article/details/83753132
2. 遍历赋值法
function extend(o,n){
for (var p in n){
if(n.hasOwnProperty(p) && (!o.hasOwnProperty(p) ))
o[p]=n[p];
}
};
3.Object.assign();
ES6的对象拷贝方法,属于浅拷贝
Object.assign(target,obj1,[...objN]);
可以把任意多个的源对象自身的可枚举属性拷贝给目标对象,然后返回目标对象。
一般的用法
Object.assign({},obj1,obj2);