Clone Multidimensional Array in javascript

后端 未结 3 1030
名媛妹妹
名媛妹妹 2020-12-10 20:37

I want to make a clone of multidimensional Array so that i can play arround with the clone array without affecting main Array.

I\'m using following function to do so

相关标签:
3条回答
  • 2020-12-10 21:11

    You need to use recursion

    var a = [1,2,[3,4,[5,6]]];
    
    Array.prototype.clone = function() {
        var arr = [];
        for( var i = 0; i < this.length; i++ ) {
    //      if( this[i].constructor == this.constructor ) {
            if( this[i].clone ) {
                //recursion
                arr[i] = this[i].clone();
                break;
            }
            arr[i] = this[i];
        }
        return arr;
    }
    
    var b = a.clone()
    
    console.log(a);
    console.log(b);
    
    b[2][0] = 'a';
    
    console.log(a);
    console.log(b);
    
    /*
    [1, 2, [3, 4, [5, 6]]]
    [1, 2, [3, 4, [5, 6]]]
    [1, 2, [3, 4, [5, 6]]]
    [1, 2, ["a", 4, [5, 6]]]
    */
    

    Any other objects in the original array will be copied by reference though

    0 讨论(0)
  • 2020-12-10 21:11

    I found that this approach is better than meouw's :

    var source = [
      [1, 2, {c:1}],
      [3, 4, [5, 'a']]
    ];
    
    // Create a new method ontop of the "Array" primitive prototype:
    Array.prototype.clone = function() {
      function isArr(elm) {
        return String(elm.constructor).match(/array/i) ? true : false;
      }
    
      function cloner(arr) {
        var arr2 = arr.slice(0),
            len = arr2.length;
    
        for (var i = 0; i < len; i++)
          if (isArr(arr2[i]))
            arr2[i] = cloner(arr2[i]);
    
        return arr2;
      }
      return cloner(this);
    }
    
    // Clone
    var copy = source.clone();
    
    // modify copy
    copy[0][0] = 999;
    
    console.dir(source);
    console.dir('**************');
    console.dir(copy);

    Another method, which can only work on data sets which have primitives
    as values (String, Numbers, Objects) :

    var source = [
      [1,2, {a:1}],
      ["a", "b", ["c", 1]]
    ];
    
    // clone "srouce" Array
    var copy = JSON.parse(JSON.stringify(source));
    
    // modyfy clone
    copy[0][0] = 999;
    
    // print both arrays
    console.dir(copy)
    console.log('***********')
    console.dir(source)

    0 讨论(0)
  • 2020-12-10 21:13

    vsync is correct, my first answer doesn't handle var a = [[1,2],[3,4]];
    So here's an improved version

    var a = [[1,2],[3,4]];
    Array.prototype.clone = function() {
        var arr = this.slice(0);
        for( var i = 0; i < this.length; i++ ) {
            if( this[i].clone ) {
                //recursion
                arr[i] = this[i].clone();
            }
        }
        return arr;
    }
    
    var b = a.clone()
    
    console.log(a);
    console.log(b);
    
    b[1][0] = 'a';
    
    console.log(a);
    console.log(b);
    
    //[[1, 2], [3, 4]]
    //[[1, 2], [3, 4]]
    //[[1, 2], [3, 4]]
    //[[1, 2], ["a", 4]]
    
    0 讨论(0)
提交回复
热议问题