2012-04-30 1 views
1

Я пытаюсь создать трехмерный массив dynamicall в javascript на основе плоского массива объектов. после цикла через массив массив кажется пустым. Если я печатаю в цикле, он, похоже, работает, но тогда он, кажется, исчез, и я хочу вернуть его вызывающему. Помогите ?Объем 3-мерного массива в javascript?

//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

Store '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

wow ... спасибо. это работает. большая разница кажется толчком. Можете ли вы объяснить, почему это так? – SPODOG

+1

Дело в том, что массив «команд» будет иметь длину 0, когда все будет сделано, потому что свойства, созданные из «лиги», не будут влиять на длину. Переменная «команды», вероятно, должна быть инициализирована с помощью '{}' вместо '[]' другими словами. – Pointy

+0

ах! да. Понимаю. Есть разница между массивом и свойствами, которые мне не хватает. Делать это, кажется, прояснить это. Большое спасибо.. – SPODOG

Смежные вопросы