2013-03-07 21 views
7

Ich muss durch JSON-Array-Objekt durchlaufen.Iterate durch verschachtelte JSON-Objekt-Array

Es hat folgende Struktur.

var myJSONObject = { 
    "abc": { 
     "prod_1": [ 
      {"prod_ver" : "prod 1 ver 1"}, 
      {"prod_ver" : "prod 1 ver 2"}, 
     ], 
     "prod_2": [ 
      {"prod_ver" : "prod 2 ver 1"}, 
      {"prod_ver" : "prod 2 ver 2"}, 
     ], 
     "prod_3": [ 
      {"prod_ver" : "prod 3 ver 1"}, 
      {"prod_ver" : "prod 3 ver 2"}, 
     ] 
    } 
}; 

Im Grunde, was ich tue, ist prod_1 Name eines Produkts ist und die Liste der Versionen, die sind bevölkert prod_1 im Inneren hat.

Also was ich will ist der Name des Produkts sowie welche Versionen es hat.

Das Problem ist, dass es viele Produkte und viele Versionen unter diesem Produkt geben kann. Also brauche ich eine ordnungsgemäße Schleifenstruktur in Javascript, die generisch sein kann, damit umzugehen.

Es wäre am besten, wenn die Schleife den Produktnamen in einer Var speichert und die Version in einer anderen Var, da es einige Überprüfungen gibt, die ich auf den Produktnamen anwenden muss.

Wenn die JSON-Struktur falsch ist oder eine bessere JSON-Struktur geschrieben werden kann, schlagen Sie bitte eine richtige/bessere Struktur vor.

Bitte HELP

Vielen Dank im Voraus.

+0

Das ist nicht JSON ist, das ist ein JavaScript-Objekt initializer

Antwort

14

Da myJSONObject.abc eine Liste von Produkten enthält, wäre es sinnvoller, die Eigenschaft abc als Array zu definieren. Wie folgt aus:

var myJSONObject = 
{ 
"abc": 
    [ 
     [ 
      {"prod_ver" : "prod 1 ver 1"}, 
      {"prod_ver" : "prod 1 ver 2"}, 
     ], 
     [ 
      {"prod_ver" : "prod 2 ver 1"}, 
      {"prod_ver" : "prod 2 ver 2"}, 
     ], 
     [ 
      {"prod_ver" : "prod 3 ver 1"}, 
      {"prod_ver" : "prod 3 ver 2"}, 
     ] 
    ] 
}; 

Dann können Sie über die Produkte durchlaufen und ihre Versionen mit normalen Schleifen:

for(var i = 0; i < myJSONObject.abc.length; i++) 
{ 
    var product = myJSONObject.abc[i]; 
    for(var j = 0; j < product.length; j++) 
    { 
     var version = product[j]; 
    } 
} 

Sie es nehmen könnte etwas weiter und ändern Sie Ihre JSON-Objekt die Struktur ein wenig, um es leichter verständlich.

var catalog = 
{ 
    "products": [ 
     { 
      "name": "prod 1", 
      "versions": [ 
       "ver 1", 
       "ver 2" 
      ] 
     }, 
     { 
      "name": "prod 2", 
      "versions": [ 
       "ver 1", 
       "ver 2" 
      ] 
     } 
    ] 
}; 

for(var i = 0; i < catalog.products.length; i++) 
{ 
    var product = catalog.products[i]; 
    var productName = product.name; 
    for(var j = 0; j < product.versions.length; j++) 
    { 
     var version = product.versions[j]; 
    } 
} 
+0

** ** Thanx die Lösung mit Katalog-Objekt scheint besser zu sein. – Saurabh

+0

Große Antwort! Vielen Dank. Wie kann ich das tun, wenn ich die Schlüsselnamen nicht kenne (zB: "Produkte", "Namen" oder "Versionen")? – iSofia

+0

Ich empfehle Ihnen, eine neue Frage zu stellen und ein Beispiel Ihrer Daten zu teilen, damit Ihnen besser geholfen werden kann. – Korijn

6

myJSONObject.abc ist ein Objekt mit Tasten wie prod_1, prod_2 usw. können Sie eine Schleife durch die Tasten eines Objekts for-in verwenden. Also:

Beachten Sie, dass die Reihenfolge der Schlüssel nicht durch die Spezifikation definiert ist und von JavaScript-Engine zu JavaScript Engine variieren wird. Wenn Sie sie in einer bestimmten Reihenfolge ausführen möchten, müssen Sie ein Array von ihnen abrufen, es in der gewünschten Reihenfolge sortieren und dann dieses Array durchlaufen. (In einer ES5-fähigen Umgebung können Sie ein Array mit den Schlüsseln eines Objekts von Object.keys(yourObject) abrufen. Für ältere Browser benötigen Sie jedoch ein Shim.)

Innerhalb dieser Schleife können Sie das Array mit a durchlaufen Standard for Schleife:

for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) { 
    // Use `productVersionArray[versionIndex].prod_ver` here 
} 

Hier ein Beispiel setzen sie alle zusammen:

(function() { 

    var myJSONObject = 
    { 
    "abc": 
     { 
      "prod_1": 
      [ 
       {"prod_ver" : "prod 1 ver 1"}, 
       {"prod_ver" : "prod 1 ver 2"} 
      ], 

      "prod_2": 
      [ 
       {"prod_ver" : "prod 2 ver 1"}, 
       {"prod_ver" : "prod 2 ver 2"} 
      ], 
      "prod_3": 
      [ 
       {"prod_ver" : "prod 3 ver 1"}, 
       {"prod_ver" : "prod 3 ver 2"} 
      ] 
     } 
    }; 

    var productName; 
    var productVersionArray; 
    var versionIndex; 

    for (productName in myJSONObject.abc) { 
     productVersionArray = myJSONObject.abc[productName]; 
     display(productName + " has " + productVersionArray.length + " versions listed"); 
     for (versionIndex = 0; versionIndex < productVersionArray.length; ++versionIndex) { 
     display("* " + productVersionArray[versionIndex].prod_ver); 
     } 
    } 

    function display(msg) { 
    var p = document.createElement('p'); 
    p.innerHTML = String(msg); 
    document.body.appendChild(p); 
    } 

})(); 

Live Copy | Source