2012-06-08 3 views
1

나는 기본적으로 이전 함수를 참조하지 않고 동일한 n 차원 배열을 반환하는 일반 함수 복사 (배열)를 찾고있다.임의의 n 차원 배열을 JavaScript로 복사 하시겠습니까?

+0

없음 ...하지만 나를 판단하지 않는다, 나는 자바 스크립트 초보자입니다. 나는 이것만을 보았습니다 : http://stackoverflow.com/questions/419858/how-to-deep-copy-an-irregular-2d-array, 그리고 그것은 내 사건에 대해 일반적으로 충분하지 않았습니다. – Ognjen

+1

@Ognjen - Java는 JavaScript가 아닙니다. –

+0

btw 내가 왜 이것을 필요로하는지 궁금하다면 java에서 js로 일부 코드를 포팅합니다. – Ognjen

답변

5

이것은 (배열되지 않은) 중첩 된 개체에 대해 작동하지 않습니다, 배열 작동 : jQuery를 사용

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

var new_arr = copy(arr); 
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 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 객체에 shim이 필요합니다.

+0

작은 메모 : 값이'undefined '이면 JSON으로 변환되지 않습니다. –

0

Paulpro의 답변에 추가하고 싶었습니다. 이것은 copy (new_arr [i])를 copy (arr [i])로 변경하고 new_arr.length를 arr.length로 변경한다는 점을 제외하고는 그의 대답과 동일하다. (new_arr [I]) 일

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

이유 사본은 .slice가 복사 때문이다 [내가] 그들에게 동일하게 가리키는했다 ARR 것.

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

이것은 다차원 배열을 복제하는 나의 해결책입니다. 사실 N 차원 배열을 생성하고 값으로 초기화하는 함수를 만들기 위해 Array.prototype.clone()을 발명해야했습니다.

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

관련 문제