循环调用$.merge()合并数组需要进行数组深复制


使用slice和concat对对象数组的拷贝,整个拷贝还是浅拷贝,拷贝之后数组各个值的指针还是指向相同的存储地址。

因此,slice和concat这两个方法,仅适用于对不包含引用对象的一维数组的深拷贝

如果数组内部属性值为引用对象,应该使用jquery的$.extend()实现对象和数组的深拷贝。

方法如下:

// 浅层复制(只复制顶层的非 object 元素)
var newObject = jQuery.extend({}, oldObject);

// 深层复制(一层一层往下复制直到最底层)
var newObject = jQuery.extend(true, {}, oldObject);

测试用例:

var obj1 = {
  'a': 's1',
  'b': [1,2,3,{'a':'s2'}],
  'c': {'a':'s3', 'b': [4,5,6]}
}

var obj2 = $.extend(true, {}, obj1);
obj2.a='s1s1';
obj2.b[0]=100;
obj2.c.b[0]=400;

console.log(obj1);
console.log(obj2);

obj2 内部元素的值改变之后,如果 obj1 的相应值保持不变,就说明复制成功。

则数组的深拷贝方法如下:

var newArr = $.extend(true,[],oldArr);

当在一个循环中,我们不断地更新oldArr,并且调用$.merge()合并oldArr时,代码如下:

for(var i=0;i<len;i++){
    ........
     var deepCopiedData = $.extend(true, [], oldArr);
     $.merge(listData,oldArr);
     deepCopiedData =null; 

}


附一道js数组复制的题目:

题目描述

在数组 arr 末尾添加元素 item。不要直接修改数组 arr,结果返回新的数组 
输入例子:
append([1, 2, 3, 4],  10)

输出例子:

[1, 2, 3, 4, 10]


function append(arr, item) {
  var newarr=arr.slice(0);
    newarr.push(item);
    return newarr;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值