2017-09-03 17 views
0

私は単純なバックアップ/元に戻す機能を構築しており、バックアップに入れるためにアレイを正しくクローン化できません。私はslice()と "ディープクローン"への再帰的な関数を使用しようとしましたが、クローンされた配列は最新の状態のコピーのままであるか、配列のすべての要素をクローンしません。多次元配列を複製する方法は?

私はバベルを使用しています。

constructor(config) { 
    this.all = []; 
    this.all.colors = [5,7]; 
    this.all.sprites = []; 
    this.all.current_sprite = 0; 
    this.all.width = config.sprite_x; 
    this.all.height = config.sprite_y; 
    this.backup = []; 
    this.backup_position = 0;  
} 

バージョン1深いクローン(動作しない)

save_backup() { 
    this.backup.push(this.deepClone(this.all)); 
    this.backup_position ++; 
    console.log(this.backup); 
} 

deepClone(arr) { 
    var len = arr.length; 
    var newArr = new Array(len); 
    for (var i=0; i<len; i++) { 
    if (Array.isArray(arr[i])) { 
     newArr[i] = deepClone(arr[i]); 
    } else { 
     newArr[i] = arr[i]; 
    } 
    } 
    return newArr; 
} 

バージョン2 slice()(動作しません)。

save_backup() { 
    this.backup.push(this.all.slice()); 
    this.backup_position ++; 
    console.log(this.backup); 
} 

配列は、すべての種類のデータが含まれます

colors : (2) [5, 7] 
config : {setting: "c64", sprite_x: 24, sprite_y: 21, colors: Array(16), zoom: 20, …} 

のような整数、配列、オブジェクト、私は間違って何をやっているの? ありがとうございました。

+0

2次元配列上にスプライスをマップするだけでは、配列全体をスプライスすることはできませんか? – Carcigenicate

+1

配列が空です。代わりにオブジェクトを使用したいかもしれません。 –

+0

'splice'ではなく' slice'を使ってコピーします。 – Bergi

答えて

0

あなたはとてもように2次元配列をクローニングするためにArray.mapと配列拡散演算子を使用することができます配列内の文字列要素は、この例ではクローン化されていないこと

const arr1 = [ 
 
    [ 'a', 'b' ], 
 
    [ 'r', 's' ] 
 
]; 
 

 
function clone2D(a) { 
 
    return a.map(o => [...o]); 
 
} 
 

 
const arr2 = clone2D(arr1); 
 

 
arr2.push(['z']); // add el to outer 
 
arr2[0].push('q');// add el to inner 
 

 
console.log(JSON.stringify(arr1)); 
 
console.log(JSON.stringify(arr2));

注そう文字列は問題ありませんが、オブジェクトは同じ参照を保持するので問題に陥る可能性があります。