复制在JavaScript的任意n维数组?(Copy an arbitrary n-dimensio

2019-06-25 07:26发布

我基本上是在寻找一个通用功能副本(数组)将返回相同的n维数组不会对前者的任何引用。

Answer 1:

这适用于阵列,它不会嵌套对象的工作(没有数组):

function copy(arr){
    var new_arr = arr.slice(0);
    for(var i = new_arr.length; i--;)
        if(new_arr[i] instanceof Array)
            new_arr[i] = copy(new_arr[i]);
    return new_arr;
}

使用这样的:

var arr = [
   [[1,2,3],[75]], 100,
   [[[1]]], [],
   [1,[2,[3],4],5], 6, 7, 8
];

var new_arr = copy(arr);


Answer 2:

使用jQuery(适用于数组和“普通”对象):

var a = [[1,[2,3]],[4]];
var b = $.extend(true, [], a);
a[0][0] = 42;             // modify object in a
alert(JSON.stringify(b)); // [[1,[2,3]],[4]]

或直接JSON(如果所有的对象都是JSON-izable):

var a = [[1,[2,3]],[4]];
var b = JSON.parse(JSON.stringify(a))
a[0][0] = 42;             // modify object in a
alert(JSON.stringify(b)); // [[1,[2,3]],[4]]

IE(8→7→)的旧版本将需要JSON对象的垫片。



Answer 3:

我只是想补充到Paulpro的答案。 请注意,这等同于他的回答只是我变更后的副本(new_arr [1])复制(ARR [1]),并new_arr.length到arr.length。

function copy(arr){
var new_arr = arr.slice(0);
for(var i = arr.length; i--;)
    if(new_arr[i] instanceof Array)
        new_arr[i] = copy(arr[i]);
return new_arr;
}

究其原因复印件(new_arr [1])的工作是因为.slice复制什么改编[I]在指指点点,使他们平等的。

此外,虽然Paulpro的回答适用于所有的情况下,如果碰巧多维数组的每个维度的每个成员或者是一个数组或一个非数组你可以只切非阵列尺寸更高效。 我的意思是复制了一个指针数组,将简单地通过下面的递归被覆盖的点?

function copy(arr){
if(arr[0] instanceof Array){
    var new_arr = new Array(arr.length);
    for(var i = arr.length; i--;)
        new_arr[i] = copy(arr[i]);
}
else{var new_arr = arr.slice(0);}
return new_arr;
}


Answer 4:

这是我的解决方案克隆多维数组; 实际上我不得不发明Array.prototype.clone()以便创造一个函数来生成N维阵列,并用值初始化它。

 Array.prototype.clone = function(){ return this.reduce((p,c,i) => (p[i] = Array.isArray(c) ? c.clone() : c, p),[]) } function arrayND(...n){ return n.reduceRight((p,c) => c = (new Array(c)).fill(true).map(e => Array.isArray(p) ? p.clone() : p )); } var arr = arrayND(...[4,4,4],8); //last argument is the initializing value arr[0][1][3] = "eight"; console.log(JSON.stringify(arr)); 



文章来源: Copy an arbitrary n-dimensional array in JavaScript?