2017-09-03 3 views
0

나는 단순한 백업/실행 취소 기능을 만들고있어 백업에 넣을 어레이를 올바르게 복제하지 못했습니다. 나는 slice()과 "딥 클론 (deep clone)"이라는 재귀 함수를 사용하여 시도했지만, 복제 된 배열은 최신 상태의 복사본으로 남아 있거나 배열의 모든 요소를 ​​복제하지 않습니다.다차원 배열을 복제하는 방법은 무엇입니까?

저는 바벨을 사용하고 있습니다. 1 개 깊은 클론 (작동하지 않습니다)

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;  
} 

버전 2 slice()이 (작동하지 않습니다)

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; 
} 

버전. 정수, 배열, 객체, 내가 잘못 뭐하는 거지

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

같은 :

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

배열은 모든 종류의 데이터를 포함? 도움을 주셔서 감사합니다.

+0

2D 배열에 스플 라이스를 '맵핑'한 다음 전체 배열을 스플 라이스 할 수 없습니까? – 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));

주 그래서 문자열은 괜찮지 만 객체가 동일한 참조를 유지하기 때문에 문제가 발생할 수 있습니다.

관련 문제