迭代嵌套的json对象数组

Sau*_*abh 13 javascript 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"},
        ]
    }
};
Run Code Online (Sandbox Code Playgroud)

基本上我正在做的是prod_1是产品的名称,prod_1的版本列表填充在其中.

所以现在我想要的是产品的名称以及它具有的版本.

问题是该产品下可能有许多产品和许多版本.所以我需要一个适当的循环结构在javascript中可以通用来处理它.

最好是循环将产品名称存储在一个var中,而将其版本存储在另一个var中,因为我需要对产品名称进行一些检查.

如果json结构错误或者可以写出更好的json结构,请建议正确/更好的结构.

帮帮忙

提前致谢.

Kor*_*ijn 17

由于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"},
        ]
    ]
};
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用普通循环遍历产品及其版本:

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];
    }
}
Run Code Online (Sandbox Code Playgroud)

你可以稍微进一步改变你的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];
    }
}
Run Code Online (Sandbox Code Playgroud)


T.J*_*der 6

myJSONObject.abc是一个具有像prod_1,prod_2等等的键的对象for-in.您可以使用循环键入对象的键.所以:

var productName;
var productVersionArray;

for (productName in myJSONObject.abc) {
    productVersionArray = myJSONObject.abc[productName];
}
Run Code Online (Sandbox Code Playgroud)

请注意,键的顺序不是由规范定义的,而是从JavaScript引擎到JavaScript引擎.如果要按特定顺序执行它们,则必须获取它们的数组,按所需顺序对其进行排序,然后循环遍历该数组.(在启用ES5的环境中,您可以从中获取对象键的数组Object.keys(yourObject).但是对于旧版浏览器,您需要一个垫片.)

在该循环中,您可以使用标准for循环遍历数组:

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

以下是将所有内容放在一起的示例:

(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);
  }

})();
Run Code Online (Sandbox Code Playgroud)

实时复制 | 资源