对象合并的方法

对象合并有三种方式:

  1. jQuery.extend()方法
  2. 遍历赋值法
  3. Object.assign()方法
1.jQuery.extend()方法

语法:

$.extend( [deep ], target, object1 [, objectN ] )

参数介绍:

参 数 详细介绍描述
deep可选。 Boolean类型 指示是否深度合并对象,默认为false。如果该值为true,且多个对象的某个同名属性也都是对象,则该"属性对象"的属性也将进行合并。即对象中的对象也要进行合并
targetObject类型 目标对象,其他对象的成员属性将被附加到该对象上。
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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值