1

私は基本的に、前者への参照なしで同一のn次元配列を返す一般的な関数copy(array)を探しています。

4

4 に答える 4

5

これは配列では機能しますが、ネストされたオブジェクト (配列ではない) では機能しません。

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);
于 2012-06-08T00:37:58.243 に答える
1

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 対応の場合):

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 オブジェクト用の shim が必要になります。

于 2012-06-08T00:39:24.227 に答える
0

Paulproの回答に追加したかっただけです。これは、copy(new_arr[i]) を copy(arr[i]) に変更し、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;
}

copy(new_arr[i]) が機能した理由は、.slice が arr[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;
}
于 2013-12-08T14:39:37.203 に答える
0

これは、多次元配列を複製するための私のソリューションです。実際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));

于 2016-05-27T11:19:47.027 に答える