循环调用$.merge()合并数组需要进行数组深复制
2016-09-23 11:58
309 查看
因此,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;
}
相关文章推荐
- php array_merge下进行数组合并的代码
- 用循环数组的方式自主配置需要调用的函数
- LeetCode.23 Merge k Sorted Lists (对数组链表进行合并,归并排序 && 或者使用PriorityQueue实现)
- php array_merge下进行数组合并的代码
- C#数组复制(合并)方法
- 本项目需要调用dll进行ice接口的调用
- 因为不想再程序中写循环,因此把UI页面需要更新的纪录的主键组成了一个以","隔开的字符串,将这个字符串传入存储过程中进行处理(转)
- 有一个数组a[1000]存放0--1000;要求每隔二个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。
- .NET 进行数据库访问时需要调用的类
- C#中如何对数组进行深复制
- PHP合并数组的简单方法与array_merge()
- PHP合并数组的简单方法与array_merge()
- How to automate mail merge to Word using OLE and ODBC[VFP调用Word邮件合并—微软提供]
- hiernate 中联合查询,得到的list是一个对象数组,这样需要进行适当处理来取值。
- java版的webservice,完全用java的正则表达式对websercice的xml进行解析,可以很快用到web中,只需要调用其中的封装好的方法
- 使对象可以像数组一样进行foreach循环,要求属性必须是私有
- MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API
- MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API
- 【翻译】MSIL 教程(二):数组、分支、循环、使用不安全代码和如何调用Win32 API
- 在Websphere上,使用axis做成的客户端调用Webservice需要进行的配置