您的位置:首页 > 其它

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

2016-09-23 11:58 309 查看




使用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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐