2013-03-07 152 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