2017-09-03 58 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

難道你不能只在二維數組上映射拼接,然後拼接整個數組? – Carcigenicate

+1

該數組爲空。您可能想改爲使用對象。 –

+0

使用'切片'來複制,而不是'拼接' – Bergi

回答

0

您可以使用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));

注意數組中的字符串元素並不在這個例子中克隆等等字符串很好,但對象仍然會遇到問題,因爲它會保留相同的引用。