【问题标题】:How to iterate JSON object properly?如何正确迭代 JSON 对象?
【发布时间】:2015-06-24 07:57:19
【问题描述】:

我从 AJAX 调用中获取了一个 JSON 对象,我需要从中获取所有“名称”值。

我尝试以多种不同的方式对其进行迭代,但均未成功。 我之前已经设法迭代 JSON 对象,但现在这些值在 pkg 内部,它在 data 内部:这就是我遇到麻烦的地方。下面的代码不起作用,我不知道如何进入 pkg。

for (var key in jsonData) {
    if (jsonData.hasOwnProperty(key)) {

    }
    jQuery('#result').html(jsonData[key].join("<br/>"));
}

(jsonData.pkg) 或 (jsonData.data.pkg) 都没有成功。

下面是 jsonData 对象内的值。

{
    "data": {
        "pkg": [{
            "name": "ThisIsName1",
            "FRONTPAGE": "n",
            "IP": "n",
            "MAXSQL": "1",
            "MAXPOP": "unlimited"
        }, {
            "name": "ThisIsName2",
            "FRONTPAGE": "n",
            "IP": "n",
            "MAXSQL": "0",
            "MAXPOP": "unlimited"
        }, {
            "name": "ThisIsName3",
            "FRONTPAGE": "n",
            "IP": "n",
            "MAXSQL": "0",
            "MAXPOP": "unlimited"
        }]
    },
    "metadata": {
        "version": 1,
        "reason": "OK",
        "result": 1,
        "command": "listpkgs"
    }
}

我已经在论坛中搜索了答案,但我没有找到将值嵌套在对象中的人。

【问题讨论】:

  • 你可以看看here
  • @herriekrekel 我已经完成了 -> var jsonData = JSON.stringify(data);
  • 您在一个对象(jsonData)中有一个对象(数据)中有一个数组(pkg)中的对象。如果您的地址为jsonData.data.pkg[0].name,您将获得ThisISName1jsonData[key] 只会返回一个对象。 here is a fiddle
  • 看看这个,所有其他答案都不必要地令人困惑。 jsfiddle.net/xmq81s7u
  • @conan JSON.stringify 将对象转换为 JSON 文本并将该 JSON 文本存储在字符串中。 JSON.parse 将一串 JSON 文本转换为一个对象。如果您想在这里使用任何答案,请使用解析看看会发生什么

标签: javascript iteration jsonobject


【解决方案1】:

试试这个代码。确保您已解析 json 字符串。并使用数组映射函数获取所有名称。

var jsonString = '{"data":{"pkg":[{"name":"ThisIsName1","FRONTPAGE":"n","IP":"n","MAXSQL":"1","MAXPOP":"unlimited"},{"name":"ThisIsName2","FRONTPAGE":"n","IP":"n","MAXSQL":"0","MAXPOP":"unlimited"},{"name":"ThisIsName3","FRONTPAGE":"n","IP":"n","MAXSQL":"0","MAXPOP":"unlimited"}]},"metadata":{"version":1,"reason":"OK","result":1,"command":"listpkgs"}}';

var jsonData = JSON.parse(jsonString);
var names = jsonData.data.pkg.map(function(pkg){ return pkg.name }).join("<br/>");
jQuery('#result').html(names);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"></div>

【讨论】:

  • 谢谢!您的代码也可以正常工作,感谢您的所有帮助!
【解决方案2】:
    for(i=0;i<jsonObj.data.pkg.length;i++){

alert(jsonObj.data.pkg[i].name;


}

【讨论】:

  • @DonCorleone 谢谢!我设法让它与你的代码一起工作!
  • 很高兴你发现它有用^^
【解决方案3】:
Array.prototype.map.call( jsonData.data.pkg ,function( el,i ) {

/*
Do with el whatever you want, here it will be object like -> {"name":"ThisIsName1","FRONTPAGE":"n","IP":"n","MAXSQL":"1","MAXPOP":"unlimited"}
*/

});

【讨论】:

    【解决方案4】:

    您可以尝试 3 个选项之一

    var myObject = {"data":
    {
        "pkg":[{"name":"ThisIsName1","FRONTPAGE":"n","IP":"n","MAXSQL":"1","MAXPOP":"unlimited"},{"name":"ThisIsName2","FRONTPAGE":"n","IP":"n","MAXSQL":"0","MAXPOP":"unlimited"},{"name":"ThisIsName3","FRONTPAGE":"n","IP":"n","MAXSQL":"0","MAXPOP":"unlimited"}]},
        "metadata":{"version":1,"reason":"OK","result":1,"command":"listpkgs"}
    }
    
    console.log("option a:");
    for (a of myObject.data.pkg) console.log(a.name);
    
    console.log("option b:");
    for (a in myObject.data.pkg) console.log(myObject.data.pkg[a].name);
    
    console.log("option c:");
    myObject.data.pkg.forEach(function (element) { console.log(element.name); });
    

    【讨论】:

      【解决方案5】:

      如果您想遍历 JSON 对象并获取其所有键,我提供此功能。

      请注意它无法在旧浏览器中运行...

          var json = {"data":
      {"pkg":[{"name":"ThisIsName1","FRONTPAGE":"n","IP":"n","MAXSQL":"1","MAXPOP":"unlimited"},
      {"name":"ThisIsName2","FRONTPAGE":"n","IP":"n","MAXSQL":"0","MAXPOP":"unlimited"},
      {"name":"ThisIsName3","FRONTPAGE":"n","IP":"n","MAXSQL":"0","MAXPOP":"unlimited"}]},
      "metadata":{"version":1,"reason":"OK","result":1,"command":"listpkgs"}};
      
      
      function getAllChildren(json, root) {
      
          function getChildren(json) {
              var result = [];
              for (var key in json) {
                  result.push(key);
              }
              return result;
          }
      
          function isObject(json) {
              return typeof json == "object";
          }
      
          root = root || "";
          if (root.length > 0) {
              root += ".";
          }
          var result = [];
          var childs = getChildren(json);
          for (var i = 0; i < childs.length; i++) {
              result.push(root + childs[i]);
              if (isObject(json[childs[i]])) {
                  var subchilds = getAllChildren(json[childs[i]], root + childs[i]);
                  for (var j = 0; j < subchilds.length; j++) {
                      result.push(subchilds[j]);
                  }            
              }
          }
      
          return result;
      }
      
      getAllChildren(json);
      

      然后它返回:

      ["data",
      "data.pkg",
      "data.pkg.0",
      "data.pkg.0.name",
      "data.pkg.0.FRONTPAGE",
      "data.pkg.0.IP",
      "data.pkg.0.MAXSQL",
      "data.pkg.0.MAXPOP",
      "data.pkg.1",
      "data.pkg.1.name",
      "data.pkg.1.FRONTPAGE",
      "data.pkg.1.IP",
      "data.pkg.1.MAXSQL",
      "data.pkg.1.MAXPOP",
      "data.pkg.2",
      "data.pkg.2.name",
      "data.pkg.2.FRONTPAGE",
      "data.pkg.2.IP",
      "data.pkg.2.MAXSQL",
      "data.pkg.2.MAXPOP",
      "metadata",
      "metadata.version",
      "metadata.reason",
      "metadata.result",
      "metadata.command"]
      

      【讨论】:

        猜你喜欢
        • 2017-05-21
        • 2019-07-21
        • 1970-01-01
        • 1970-01-01
        • 2016-01-25
        • 2021-09-07
        • 2014-11-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多