js多层对象数组 合并_js中数组的合并和对象的合并

1 数组合并

1.1 concat 方法

js的Array对象提供了一个叫concat()方法,连接两个或更多的数组,并返回结果。

这里有一个问题,concat方法连接a、b两个数组后,a、b两个数组的数据不变,同时会返回一个新的数组。这样当我们需要进行多次的数组合并时,会造成很大的内存浪费,所以这个方法肯定不是最好的。

1.2 循环遍历

大概的思路是:遍历其中一个数组,把该数组中的所有元素依次添加到另外一个数组中。直接上代码:

这样的写法可以解决第一种方案中对内存的浪费,但是会有另一个问题:丑!这么说不是没有道理,如果能只用一行代码就搞定,岂不快哉~

1.3 apply

函数的apply方法有一个特性,那就是func.apply(obj,argv),argv是一个数组。所以我们可以利用这点,

合并数组a和数组b,使用Array.prototype.push.apply(a,b)  或者 a.push.apply(a,b);

a.push.apply(a,b);

调用a.push这个函数实例的apply方法,同时把,b当作参数传入,这样a.push这个方法就会遍历b数组的所有元素,达到合并的效果。

这里可能有点绕,我们可以把b看成[4,5,6],变成这样:

a.push.apply(a,[4,5,6]);

然后上面的操作就等同于:

a.push(4,5,6);

1.4 ES6写法——扩展运算

1.5 ES6写法——使用map()

注意:

1)以上合并方法并没有考虑过a、b两个数组谁的长度更小。

所以好的做法是预先判断a、b两个数组哪个更大,然后使用大数组合并小数组,这样就减少了数组元素操作的次数!

2)有时候我们不希望原数组(a、b)改变,这时就只能使用concat了。

2 对象合并

2.1 $.extend()

2.2 遍历赋值

2.3 Obj.assign()

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

Object.assign(target, ...sources)

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的影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值