2011-01-23 6 views
0

그래, 난 2 차원 배열을로드하고 몇 가지 문제가있어. 여기에 내 코드입니다 : 나는이 문제를 해결하려면 어떻게js에 2 차원 배열을로드하는 방법은 무엇입니까?

Firebug's log limit has been reached. 0 entries not shown.  Preferences 
blockArray[i] is undefined 
[Break On This Error] blockArray[i][j] = new block(i *...level[i][j], false, false, tempImg); 

: 여기

var blockSize = 30; 

var level = new Array(new Array(0, 1, 0, 1, 0, 1, 0, 1, 0, 1), new Array(1, 0, 1, 0, 1, 0, 1, 0, 1, 0)); 

var blockArray = new Array(1); 
blockArray[0] = new Array(1); 

function readLevel() { 
    for (var i = 0; i < level.length; i++) { 
     for (var j = 0; j < level[i].length; j++) { 
      var tempImg = new Image(); 
      tempImg.src = "images/block.png"; 
      blockArray[i][j] = new block(i * blockSize, j * blockSize, level[i][j], false, false, tempImg); 

      //throw('blockArray['+i+']'+j+'] = ' + level[i][j]); 
     } 
    } 
} 

을 그리고 내 오류가?

+2

'new Array (1)'을 쓸 때 빈 1 요소 배열 또는 '1'을 포함하는 1 요소 배열을 만들려고합니까? 비어있는 n 요소 배열을 만들고 싶지 않다면 new Array() 생성자를 사용할 이유가 없습니다. 배열 리터럴을 대신 사용하십시오. 예를 들어,'new Array (0, 1, 0, 1, 0, 1, 0, 1, 0, 1)'호출은 단순히'[0, 1, 0, 1, 0, 1, 0, 1 , 0, 1]이다. –

+2

'var level = [[0, 1, 0, 1, 0, 1, 0, 1, 0, 1], [1, 0, 1, 0, 1, 0, 1, 0, 1, 0 ]]; ' –

답변

5

바깥 쪽 루프는 i에 있으며, 0 .. 1 (포함)입니다. blockArray[1]을 절대 설정하지 않으므로 정의되지 않았습니다. 그러므로 blockArray[i][j] = ... 행은 정의되지 않은 값 (i = 1 일 때 blockArray[i]은 정의되지 않음)에 색인을 생성 할 수 없으므로 실패합니다.

나는 당신의 코드가 어떻게 무엇을 의미하는지 전혀 모르겠지만, 이것은 당신이 어쨌든, 가까이해야합니다 나는 또한 배열 리터럴 구문 대신 new Array(n) 구문을 도랑을 한

var blockSize = 30; 

var level = [ 
       [0, 1, 0, 1, 0, 1, 0, 1, 0, 1], 
       [1, 0, 1, 0, 1, 0, 1, 0, 1, 0] 
      ]; 

var blockArray = []; 

function readLevel() { 
    for (var i = 0; i < level.length; i++) { 
     blockArray[i] = []; // Create the second level for this index 
     for (var j = 0; j < level[i].length; j++) { 
      var tempImg = new Image(); 
      tempImg.src = "images/block.png"; 
      blockArray[i][j] = new block(i * blockSize, j * blockSize, level[i][j], false, false, tempImg); 

      //throw('blockArray['+i+']'+j+'] = ' + level[i][j]); 
     } 
    } 
} 

주 . 네가 여기에서하는 일에 대해선 분명해.

자바 스크립트에는 실제로 배열이없고 실제로는 2D 배열이 없다는 것을 알아야합니다. 자바 스크립트 "배열"은 실제로 속성 이름의 클래스 (완전히 숫자로 구성된 클래스)에 특수 처리를 제공하고 특별한 length 속성을 가진 객체입니다. (그리고 물론, 그들은 Array.prototype에서 상속하는 모든 기능을 가지고 있습니다.) More here.

+0

그 덕분에, 고마워요! – CyanPrime

+0

@CyanPrime : 아무 걱정도 없습니다. 기꺼이 도와주었습니다. 관심의 대상이 될 수있는 답변의 끝에 링크를 추가했습니다. –

0

시도 사이에 추가 할이이 라인을-루프에 대한

blockArray[i] = new Array(); 

두 번째 수준의 배열을 만듭니다.

function readLevel() { 
    for (var i = 0; i < level.length; i++) { 
     blockArray[i] = new Array(); 
     for (var j = 0; j < level[i].length; j++) { 
      [etc] 
     } 
    } 
} 
+0

또는'blockArray [i] = [];'왜이 사람들은 왜이 다른 표기법을 계속 사용합니까? ''''이 분명히 더 낫다. –

+0

은'[]'더 나은가요? –

+1

[이 Q & A.를보십시오] (http://stackoverflow.com/questions/1936047/jslint-use-the-array-literal-notation-for-var-os-map) – user113716

관련 문제