2012-04-06 30 views
0

2次元配列を作成しようとしていますが、このエラーが発生しています。2次元配列で未定義のプロパティ '3'を設定できません

オブジェクトをループして割り当てを試みますが、2番目の次元に値を割り当てることはできません。

これは私が持っているものです。

//this is globally set 
var gcollision = new Array(); 

function create() { 
    for (var X in sdata) { 
     X = parseInt(X); 
     for (var Y in sdata[X]) { 
      Y = parseInt(Y); 
      width = parseInt(sdata[X][Y][2]); 
      height = parseInt(sdata[X][Y][3]); 
      for (i = X; i != X + width; i++) { 
       //error occurs here "Uncaught TypeError: Cannot set property '3' of undefined" 
       gcollision[i][Y] = 1 
       for (j = Y; j != Y + height; j++) { 
        gcollision[X][j] = 1 
       } 
      } 
     } 
    } 

どのように私はそれが正しくの値を設定するのですか?

var sdata = {"4":{"7":["1","7","3","3"]},"3":{"3":["2","8","1","1"]}}; 
+0

sdataの外観は? –

答えて

2
//this is globally set 
var gcollision = new Array(); 

function create(){ 
    for (var X in sdata) { 
     X = parseInt(X); 
     for (var Y in sdata[X]) { 
      Y = parseInt(Y); 
      width = parseInt(sdata[X][Y][2]); 
      height = parseInt(sdata[X][Y][3]); 

for (i=X; i!= X+width; i++) { 
       if(typeof gcollision[i] == 'undefined') gcollision[i] = new Array(); 
       gcollision[i][Y] = 1 

for (j=Y; j!=Y+height; j++) { 
       if(typeof gcollision[X] == 'undefined') gcollision[X] = new Array(); 
       gcollision[X][j] = 1 
       } 
      } 
     } 
    } 

あなたがそれらを定義した後まで、あなたは配列としてそれらを参照することはできませんので、基本的に、あなたはあなたの配列を作成していても、これらの指標は、まだ存在しない:

EDITのSDATAは次のようになりますなど。

forループをもう少し最適に設定すると、issetを行う必要がなく、最初にアクセスされる内側ループの直前にgcol[index] = Array();を作成することができます。

+0

最後に、オブジェクトを持つよりも優れた配列を作っていますか?後でチェックを行う方が効率的でしょうか? – Sir

+0

また、私はあなたがより最適にループの設定について何を意味するのか分かりませんか? – Sir

+0

Javascriptでは、2つの(配列とオブジェクト)の違いの大部分がわかりません。内部的には、とにかく同じ方法で処理されるでしょう。最適化に関しては、幅と高さの変数にどのような種類のデータがあるのか​​わからないので、現在gcollision []の型を内部ループでチェックしています。 gcol [index]配列がそのループの外側で作成されるように関数を再構成できる場合は、if-operationsの順序を自分で保存します。 –

1

まず、最初のレベルの配列を初期化する必要があります。

function create() { 
    for (var X in sdata) { 
     X = parseInt(X); 
     gcollision[X] = []; 

     for (var Y in sdata[X]) { 
      Y = parseInt(Y); 
      width = parseInt(sdata[X][Y][2]); 
      height = parseInt(sdata[X][Y][3]); 
      for (i = X; i < X + width; i++) { 
       gcollision[i][Y] = 1; 

       for (j = Y; j < Y + height; j++) { 
        gcollision[X][j] = 1; 
       } 
      } 
     } 
    } 
+0

これは最も効果的な方法ですか? – Sir

+0

@Dave:おそらく。しかしそれほど重要なことではありません。 – Ryan

関連する問題