JS中多维数组的深拷贝的多种实现方式

因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型,所以直接用=号赋值的话,只是把源数组的地址(或叫指针)赋值给目的数组,并没有实现数组的数据的拷贝。另外对一维数组和多维数据的深拷贝实现方式是不一样的,下面分别讨论。

 

  一、 错误实现  

var array1 = new Array("1","2","3"); 
var array2; 
array2 = array1; 
array1.length = 0; 
alert(array2); //返回为空

这种做法是错的,因为javascript分原始类型与引用类型(与java、c#类似)。Array是引用类型。array2得到的是引用,所以对array1的修改会影响到array2。

 

  二、 一维数组的实现方式:

  使用slice() 或者 concat()来实现一维数组的深拷贝,但这种方法只适用于一维数组,对多维数组无效。

  可使用slice()进行复制,因为slice()返回也是数组。  

var array1 = new Array("1","2","3"); 
var array2; 
array2 = array1.slice(0); 
array1.length = 0; 
alert(array2); //返回1、2、3  

 

  注意concat()返回的并不是调用函数的Array,而是一个新的Array,所以可以利用这一点进行复制。

var array1 = new Array("1","2","3"); 
var array2; 
array2 = array1.concat(); 
array1.length = 0; 
alert(array2); //返回1、2、3 

 

  三、 多维数组的JS函数实现方式:

复制代码
复制代码
    function deepcopy(obj) {
            var out = [],i = 0,len = obj.length;
            for (; i < len; i++) {
                if (obj[i] instanceof Array){
                    out[i] = deepcopy(obj[i]);
                }
                else out[i] = obj[i];
            }
            return out;
        }
    
     //下面是测试代码     
        var weekArray = new Array(7);//数组第一维
        var timeTableArray = new Array();  //数组第二维
        var lineArray = new Array(4);  //数组第三维
        
        lineArray[0] = "1_a";
        lineArray[1] = "1_b";
        lineArray[2] = "1_c";
        timeTableArray.push(lineArray);
        weekArray[0] = deepcopy(timeTableArray);
        
        
        //清空,并添加其他星期的数据
        lineArray.splice(0,lineArray.length);
        timeTableArray.splice(0,timeTableArray.length);
        
        lineArray[0] = "7_a";
        lineArray[1] = "7_b";
        lineArray[3] = "7_d";
        timeTableArray.push(lineArray);
        weekArray[7] = deepcopy(timeTableArray);
        
        alert("weekArray=" + weekArray[0]);//返回 "1_a,1_b,1_c,"
        alert("weekArray=" + weekArray[7]);//返回 "7_a,7_b,,7_d"
复制代码
复制代码

 

  四、 多维数组的jquery实现方式:

   把上述的deepcopy函数用下面的函数替代即可

  weekArray[0] = $.extend(true, {}, timeTableArray);

来源:http://www.cnblogs.com/matthew-2013/p/3524297.html

posted @   littlewrong  阅读(3928)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示
点击右上角即可分享
微信分享提示