码迷,mamicode.com
首页 > 编程语言 > 详细

关于数组的深度克隆(未完待续)

时间:2017-09-05 20:07:53      阅读:203      评论:0      收藏:0      [点我收藏+]

标签:bsp   logs   克隆   返回   有一个   问题   ++   func   eof   

我们知道,Array.prototype上有一个slice()方法,可以对数组进行克隆,但是这个方法并不完美。如果一个数组是一维数组,使用slice()方法没有任何问题,但如果是一个多维数组,那么这个方法就不是那么完美了。

1 //一维数组的克隆
2 var ary1 = [1,2,3];
3 var ary2 = ary1.slice();
4 console.log( ary1 === ary2 ) ; // false,ary1和ary2的引用地址不一样,互不影响

 

有些时候,我们想复制一个内容一样,但互不影响的数组,单纯使用slice()方法,就不能满足我们的需求了,如下所示:

1 //多维数组的克隆
2 var ary1 = [1,[2,3];
3 var ary2 = ary1.slice();
4 console.log (ary1 === ary2 ); // false,ary1和ary2的引用地址不一样,互不影响
5 console.log (ary1[1] === ary2[1] ); // true,slice()仅对第一维进行了克隆,但是第二维并没有克隆,ary1[1]和ary2[1]存储的是同一个数组的引用地址,所以返回true

 

我们可以使用递归来达到深度克隆的效果。

 1 //多维数组的克隆
 2 function copyAry(ary){
 3     ary=ary.slice(); //将当前传入的数组进行第一维克隆
 4     // 遍历数组
 5     for(var i=0;i<ary.length;i++){
 6         // 如果第i项存储的是数组,那么仍然使用copyAry方法进行克隆
 7         if(typeof ary[i]===‘Array‘){
 8              ary[i]=copyAry(ary[i]);
 9         }
10     }
11     // 返回克隆后的数组
12     return ary;
13 }

 

关于数组的深度克隆(未完待续)

标签:bsp   logs   克隆   返回   有一个   问题   ++   func   eof   

原文地址:http://www.cnblogs.com/fxf111/p/7481635.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!