2013-03-07 207 views
7

我必須遍歷json數組對象。通過嵌套的json對象數組迭代

它具有以下結構。

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"}, 
     ] 
    } 
}; 

基本上我正在做的是prod_1是一個產品的名稱和prod_1所包含的版本列表。

所以現在我想要的是產品的名稱以及它的版本。

問題是可以有許多產品和該產品下的許多版本。 所以我需要一個合適的循環結構javascript可以通用來處理它。

如果循環將產品名稱存儲在一個變量中,並且它的版本在另一個變量中,那麼最好是因爲有一些檢查需要對產品名稱進行檢查。

如果json結構錯誤或者可以編寫更好的json結構,請提出正確/更好的結構。

HELP

在此先感謝。

+0

這不是JSON,這是一個JavaScript對象初始化 2013-03-07 10:25:44

回答

14

由於myJSONObject.abc包含產品列表,因此將數組abc定義爲數組更有意義。就像這樣:

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"}, 
     ] 
    ] 
}; 

然後你可以遍歷產品和使用正常的循環它們的版本:

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]; 
    } 
} 

你可以把它進一步小幅並改變你的JSON對象的結構有點使它更容易可以理解的。

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

** **感謝名單與目錄對象的解決方案似乎是更好的。 – Saurabh 2013-03-08 11:30:36

+0

很好的回答!謝謝。如果我不知道關鍵名稱(即:「產品」,「名稱」或「版本」),我怎麼能這樣做? – iSofia 2017-05-21 05:01:15

+0

我建議創建一個新問題並分享數據示例,這樣您可以獲得更好的幫助。 – Korijn 2017-05-21 10:04:32

6

myJSONObject.abc是一個帶有像prod_1,prod_2等鍵的對象。您可以使用for-in循環訪問對象的鍵。所以:

var productName; 
var productVersionArray; 

for (productName in myJSONObject.abc) { 
    productVersionArray = myJSONObject.abc[productName]; 
} 

請注意,鍵的順序不是由規範定義,並且會因JavaScript引擎而異。如果你想按特定的順序來完成它們,你必須得到它們的一個數組,按照你想要的順序排序,然後循環訪問這個數組。 (在啓用ES5的環境中,您可以從Object.keys(yourObject)獲得一個對象的鍵陣列,但是您需要爲較老的瀏覽器使用墊片。)

在該循環中,您可以使用標準for循環:

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

這裏的推杆爲例一起:

(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