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);

  • 相关阅读:
    Minimum Depth of Binary Tree leetcode java
    Maximum Depth of Binary Tree leetcode java
    Symmetric Tree leetcode java
    Same Tree leetcode java
    Binary Tree Postorder Traversal leetcode java
    Binary Tree Preorder Traversal leetcode java
    Binary Tree Inorder Traversal leetcode java
    Combinations leetcode java
    一键清除Centos iptables 防火墙所有规则
    阿里云centos7.7x64安装open,并配置ip转发和nat伪装
  • 原文地址:https://www.cnblogs.com/matthew-2013/p/3524297.html
Copyright © 2011-2022 走看看