2012-01-25 4 views
6

제발 설명해주세요. for 루프를 사용하여 배열 배열을 만들려고합니다. 작동하지 않을 때 Javascript가하는 일을 이해하기 위해 코드를 단순화하려고 시도했지만 간단한 코드는 이해할 수 없습니다.자바 스크립트 : for 루프를 사용하여 배열에 배열 푸시

function test(){ 
    var sub_array = []; 
    var super_array =[]; 
    for (var i=1;i<=3;i++){ 
     sub_array.push(i); 
     super_array.push(sub_array); 
    } 
    alert(super_array); 
} 

[1; 1,2; 1,2,3]. 대신 [1,2,3; 1,2,3; 1,2,3]. 0-2를 반복하고 색인으로 지정하면 동일한 현상이 발생합니다.

답변

6

"sub_array"를 누르면 복사본을 밀지 않을 것입니다. "super_array"에서 동일한 배열로 세 번 끝납니다. (난 당신이 같은 배열을 세 번 참조를 밀어하고 있다고한다.)

당신은이 작업을 수행 할 수 있습니다 :

// ... 
    super_array.push(sub_array.slice(0)); 

복사본을 만들 수 있습니다.

0

super_array에 추가 할 동일한 sub_array입니다. 왜 다른가?

새 배열을 생성하지 않고 super_array로 푸시하는 중입니다.

13

항상 동일한 어레이에 대한 참조를 수퍼 어레이로 밀어 넣고 있습니다.

그 문제를 해결하기 위해, 당신은 그것을 밀어 전에 하위 배열을 복제 slice()를 사용할 수 있습니다

function test() { 
    var sub_array = []; 
    var super_array = []; 
    for (var i = 1; i <= 3; i++) { 
     sub_array.push(i); 
     super_array.push(sub_array.slice(0)); 
    } 
    alert(super_array); 
} 

편집 : 댄 D. 정당 아래에서 지적 하듯이, 당신은 또한 인수없이 concat()를 호출 할 수 있습니다 slice(0) 대신. 그것은 빠릅니다 this article에 따라 (내가 직접 측정하지 않았다) :

for (var i = 1; i <= 3; i++) { 
    sub_array.push(i); 
    super_array.push(sub_array.concat()); 
} 
+2

왜'.slice (0)'을 사용하여'.concat()'이 아닌 Array를 복사하기로 결정 했습니까? 더 빨라질 수도 있지만 필자는 잘 모르고 있었다. –

+0

[이 블로그] (http://swingpants.com/2009/03/12/fastest-way-to-copy-an-array-concat-or-slice0/)에 따르면 흥미 롭다. 'concat()'는 더 빠릅니다. . 내 대답에서 언급 할께. 귀하의 의견을 보내 주셔서 감사합니다 :) –

0

sub_arraysuper_array에 참조로 저장이 당신이 sub_array을 변경할 때 변경이 당신이 super_array

1

주 안에 반영되는 것을 의미 for-loop의 각 반복에 대해 동일한 배열을 super_array로 푸시합니다. 대신 다음을 시도하십시오.

function test(){ 
    var sub_array = []; 
    var super_array =[]; 
    for (var i=1;i<=3;i++){ 
     sub_array = sub_array.slice(0,sub_array.length); 
     sub_array.push(i); 
     super_array.push(sub_array); 
    } 
    alert(super_array); 
} 
+0

+1 슬라이스를 사용하여, 당신이 그것을 전체 배열을 복제하는 데 사용할 때 매개 변수를 전달할 필요는 없지만 arr.slice() === arr.slice (0, arr.length) – wheresrhys

2

우물. 당신은 그 배열, 객체, 함수, 등등 자바 스크립트 (숫자 (정수, 수레, 등) 및 문자열에 의해 참조 가치가 "가치에 의해 전달됩니다, 그 값을 복사/복제) 이해해야한다! var a=[];이 있고 var b=a이라고 말하고 b.push("bla")을 추가 한 다음 a를 경고하면 b에 추가 한 경우에도 "bla"항목이 표시됩니다. 즉, a와 b는 "왼쪽 모래가 당신을위한 모래"라고 말하는 엄마로부터의 frige와 같은 자바 스크립트입니다. 그리고 냉장고에서 임의의 샌드위치가 아닌 왼쪽의 것을 가져가는 것입니다. 그녀는 집 문에 또 다른 메모 (변수 b)를 써서 서둘러야 할 곳을 알고 어디에서 샌드위치를 ​​찾을 수 있습니다. 그녀가 문에 샌드위치를 ​​붙이면 .. 음, 그것은 어색 할 것입니다.그리고 JS는 그것에 대해 같은 생각 :

그래서 문제에 대한 해결책은 가을이다;

function test(){ 
    var super_array =[]; 
    for (var i=1;i<=3;i++){ 
     var subarray=[]; 
     for (var u=1;u<=4-i;u++){ 
      sub_array.push(u); 
      super_array.push(subarray); 
     } 
    } 
    alert(super_array); 
} 

하위 배열을 재정 의하여 새로운 참조를 만듭니다. 그래서 변수 b (집문의 두 번째 음표)가 다른 샌드위치 (아마도 아빠의 샌드위치)의 방향을 가리키고 있습니다.

여러분의 이해를 도울 수 있기를 바랍니다.

관련 문제