2010-03-21 13 views
3

J'ai un tableau JSON bidimensionnel où chaque élément contient plusieurs attributs. L'exemple ci-dessous est volontairement simplifié:Analyser un tableau JSON bidimensionnel en Javascript

var map_data = { "1": 
         {"1":{"name":"aa"},"2":{"name":"bb"}}, 
       "2": 
         {"1":{"name":"cc"},"2":{"name":"dd"}} 
       }; 

J'essaie d'analyser les données, mais .length ne fonctionne pas:

for(x=1; x<=map_data.length; x++) { 
    for(y=1; y<=map_data[x].length; y++) { 
     // CODE 
    } 
} 

Un grand merci!

Répondre

7

Ce n'est pas un tableau, ce sont des objets simples, c'est la raison pour laquelle vous ne pouvez pas utiliser la propriété length.

Vous devez utiliser la déclaration for...in:

for(var x in map_data) { 
    if (map_data.hasOwnProperty(x)) 
    for(var y in map_data[x]) { 
     if (map_data[x].hasOwnProperty(y)) { 
     // CODE 
     } 
    } 
} 

Les hasOwnProperty chèques sont parce que cette déclaration itère sur toutes les propriétés, héritées ou non, et si quelque chose (comme certains frameworks JavaScript) augmenté les Array.prototype ou Object.prototype objets , ces propriétés augmentées seront également itérées.

Vous devez savoir que cette déclaration ne garantit pas l'ordre d'itération.

Je vous recommande d'utiliser un tableau « réel »:

[ 
[{"name":"aa"},{"name":"bb"}], 
[{"name":"cc"},{"name":"dd"}] 
] 

De cette façon, vous serez en mesure d'utiliser la propriété length itérer sur les indices.

+0

+1 pour pointer dans la direction d'un tableau réel. Il ne cesse de m'étonner combien de questions impliquent la définition de propriétés d'index numériques sur des objets. –

2

Depuis map_data est un objet au lieu d'un tableau, vous devez utiliser for/in boucle:

for (var x in map_data) { 
    // check for hasOwnProperty omitted for simplicity. 
    for (var y in map_data[x]) { 
    // CODE. 
    } 
} 

Mais il est préférable d'envoyer ce JSON comme un tableau [a,b,c] au lieu d'un objet {"0":a,"1":b,"2":c}.

0

Utilisez la for .. in construction:

for (var m in map_data) { 
    // ... 
} 

De plus, je dois souligner que ce n'est pas un « tableau JSON », mais plutôt un objet imbriqué. JSON est simplement la représentation sous forme de chaîne d'objets et de tableaux JS imbriqués.

2

hasOwnProperty est utilisé pour déterminer si un objet possède la propriété spécifiée en tant que propriété directe de cet objet sans égard à sa chaîne prototype.

for(var i in map_data){ 
    if(map_data.hasOwnProperty(i)){ 
     for(var j in map_data[i]){ 
      if(map_data[i].hasOwnProperty(j)){ 
       /*do whatever you want with map_data[i][j]*/ 
      } 
     } 
    } 
} 
0

si elle aide quelqu'un, est un exemple de C# et javascript:

C#:

List<List<string>> list_array = new List<List<string>>(); 

JavaScriptSerializer jss = new JavaScriptSerializer(); 
string _myJSONstring = jss.Serialize(list_array); 

/* dans ce list_array cas est une bidimensional liste, mais peut être un seul tableau, si l'impression _myJSONstring, cela montrera comme ceci: "[[" XX " "AAAA"], [ "AA", "BBBB"]]" */

javascript:

dans une fonction qui se la chaîne de C#:

var a = JSON.parse(array); 
    for (var t = 0; t < array.length; t++) { 
     for (v = 0; v < array[t].length; v++) { 
      alert(array[t][v]); 
     } 
    } 
Questions connexes