2012-04-30 13 views
1

私は、オブジェクトのフラットな配列に基づいて、JavaScriptで3次元配列のdynamicallを作成しようとしています。配列をループした後、配列は空に見えます。ループ中に印刷すると動作するように見えますが、消えてしまったように見えますので、これを呼び出し元に返す必要があります。助けて ?javascriptの3次元配列のスコープ?

//init the 3d array ?? 
this.teams = []; 
for(var i = 0; i < sportsStandings.length; i++) { 
    var item = sportsStandings[i]; 
    if(!this.teams[item.league]) 
    this.teams[item.league] = new Array(); 

    if(!this.teams[item.league][item.division]) 
    this.teams[item.league][item.division] = new Array(); 

    this.teams[item.league][item.division][this.teams[item.league][item.division].length] 
    = new Team(item.teamName, item.wins, item.losses); 

    console.log(this.teams); //this prints properly, and i see the 3d array grow 
} 
console.log('second' + this.teams); //this prints nothing 
+3

これらの「リーグ」、「除算」などのプロパティが数値でない場合は、実際には配列を構築していないため、プロパティを持つオブジェクトを構築しています。 JavaScript配列の動作は、数値インデックス付きのプロパティにのみ適用されます。その "sportsStandings"配列には正確に何が入っていますか? – Pointy

+0

また、 'console.log'はブラウザ間で異なる印刷書式設定の動作をします。 – adu

+2

sportsStandings [i] 'を変数に格納し、その変数を参照すると、パフォーマンスに役立ち、読みやすくなります。 – epascarello

答えて

0

コードを少しきれいにしましたが、それを書くにはいくつかの方法があります。

this.teams = []; 
var teams = this.teams; 
for(var i = 0; i < sportsStandings.length; i++) { 

    var ss = sportsStandings[i], 
     league = ss.league, 
     division = ss.division, 
     teamName = ss.teamName, 
     wins = ss.wins, 
     losses = ss.losses; 

    if (!teams[league]) { 
     teams[league] = {}; 
     teams[league][division] = []; 
    } else if (!teams[league][division]) { 
     teams[league][division] = []; 
    } 

    var newTeam = new Team(teamName, wins, losses); 
    teams[league][division].push(newTeam); 
} 
+0

うわー...ありがとう。それは動作します。大きな違いはプッシュであるようです。なぜそれが説明できますか? – SPODOG

+1

"リーグ"から作られたプロパティは長さに影響しないので、 "チーム"配列はすべて完了したら長さ0になります。 "teams"変数は、おそらく '[] 'の代わりに' {} 'で初期化されるべきです。 – Pointy

+0

ああ!はい。そうですか。配列とプロパティとの間には違いがあります。これを行うと、それがクリアされるようです。ムチャス・グラシアス.. – SPODOG