zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    技术汇总:第四章:使用Easyui做三级下拉列表
    全文检索工具elasticsearch:第四章:开发电商的搜索列表功能
    全文检索工具elasticsearch:第三章: Java程序中的应用
    技术汇总:第三章:拖拉验证
    分布式部署:第三章:Docker、MySQL、tomcat、Nginx、Redis部署
    分布式部署:第二章:MyCat和Nginx部署
    分布式部署:第一章:zookeeper集群和solrcloud及redisCluster集群搭建
    技术汇总:第二章:JUC
    大型电商网站:第四章:业务功能与数据结构分析
    大型电商网站:第二章:项目开发介绍
  • 原文地址:https://www.cnblogs.com/matthew-2013/p/3524297.html
Copyright © 2011-2022 走看看