2013-08-19 3 views
0
  { 
      "wordsacross": [ 
       {"ACHE": [ 
        { "letter":"A" , "square":"A1" }, 
        { "letter":"C" , "square":"A2" }, 
        { "letter":"H" , "square":"A3" }, 
        { "letter":"E" , "square":"A4" } 
       ]}, 
       {"OPT": [ 
        { "letter":"O" , "square":"A6" }, 
        { "letter":"P" , "square":"A7" }, 
        { "letter":"T" , "square":"A8" } 
       ]} 
      ], 
      "wordsdown": [ 
       {"ALPHA": [ 
        { "letter":"A" , "square":"A1" }, 
        { "letter":"L" , "square":"B1" }, 
        { "letter":"P" , "square":"C1" }, 
        { "letter":"H" , "square":"D1" }, 
        { "letter":"A" , "square":"E1" } 
       ]}, 
       {"BRO": [ 
        { "letter":"B" , "square":"G1" }, 
        { "letter":"R" , "square":"H1" }, 
        { "letter":"O" , "square":"I1" } 
       ]} 
      ] 
      } 

      $.ajax({ 
       type: "POST", 
       url: "query.words.php", 
       data: { puzzleid: vPuzzleId }, 
       async: false 
      }).done(function(msg) { 
       vWords = JSON.parse(msg); 
       console.log(vWords); 
       console.log("There are "+vWords["wordsacross"].length+" words across"); 
       for(var i=0;i<vWords["wordsacross"].length;i++) 
       { 
        console.log(vWords["wordsacross"][i].length); 
        console.log(vWords["wordsacross"][i][0]["square"]); 
       } 
      }); 

Я пытаюсь распечатать содержимое всех квадратных элементов на консоли. Обе мои попытки на console.log выходят неопределенно. Как мне получить доступ к каждому квадрату и распечатать его на консоли?Получение длины вложенного массива JSON в JavaScript

Заранее спасибо ...

+0

что произойдет, если вы добавляете код ' console.log (msg) 'перед линией' vWords = JSON.parse (msg); '? – zzlalani

ответ

5

vWords['wordsacross'] или vWords.wordsacross (эквивалент) содержит один массив с двумя элементами. Когда вы пишете vWords['wordsacross'][i], вы получаете доступ к одному из этих элементов. Затем вы пытаетесь получить доступ к length или [0] этого единственного элемента, но этот элемент не является массивом, это объект.

Для i = 0 это объект, который имеет свойство с именем ACHE и , что является массивом.

Вы можете таким образом написать:

vWords.wordsacross[0].ACHE.length 

Путь ваш объект структурирован, свойство, содержащее массив букв другой один для каждого элемента массива, который может быть немного неудобно. Вы можете перечислить собственные свойства объекта с помощью Object.keys(vWords.wordsacross[i]), но я бы рекомендовал изменить ваш объект, если это вариант.

Например, один элемент в массиве wordsacross может иметь word свойства, для которого значение будет ACHE и letters свойства, для которого значение будет ваш массив букв. Таким образом, вы можете получить доступ к vWords.wordsacross[i].letters, не зная, что слово происходит с "ACHE":

"wordsacross": [ 
    {"word": "ACHE", 
    "letters": [ 
     { "letter":"A" , "square":"A1" }, 
     { "letter":"C" , "square":"A2" }, 
     { "letter":"H" , "square":"A3" }, 
     { "letter":"E" , "square":"A4" } 
    ]} 
], 

Поскольку буквы "A", "C", "H", "E" могут быть выведены из слова "ACHE" вы можете быть в состоянии получить прочь с только письма:

"wordsacross": [ 
    { "word": "ACHE"; 
     "squares": ["A1", "A2", "A3", "A4"] 
    } 
] 

строка "ACHE" можно рассматривать как массив символов; вы можете получить его length, и вы можете получить доступ к карестре в любой заданной позиции, wordsacross[0].word[i].

+0

Да, я думаю, что тогда объект нужно изменить. Я действительно не знаю, как это должно выглядеть. – Giuseppe

0

попробуйте vWords.wordsacross только (без скобок) :)

1

http://jsfiddle.net/xp8Ww/

for(var i=0;i<vWords["wordsacross"].length;i++) 
      { 
       var keys =Object.keys(vWords["wordsacross"][i]); 
       console.log(keys.length); 
       for(var j=0;j<keys.length;j++){ 
        var keys2=vWords["wordsacross"][i][keys[j]].length; 
        for(var k=0;k<keys2;k++){ 
         console.log(vWords["wordsacross"][i][keys[j]][k]["square"]); 
        } 
       } 

      } 
0

Попробуйте

for (key in vWords) { //Iterate for wordsacross and wordsdown 
    console.log(key); 
    var words = vWords[key]; //Get the value for wordsacross and wordsdown 
    for (var i = 0; i < words.length; i++) { //Iterate over the words 
     for (word in words[i]) { //Iterate over the word object 
      console.log(word); 
      var wordSquares = words[i][word]; //Get the letter and square info for word object 
      for (var j = 0; j < wordSquares.length; j++) { //Iterate over the letters 
       console.log(wordSquares[j].letter); 
       console.log(wordSquares[j].square); 
      } 
     } 
    } 
} 

Это перебрать все слова в результатах и ​​печати письма и квадраты соответственно