【问题标题】:How do I iterate over a JSON structure? [duplicate]如何迭代 JSON 结构? [复制]
【发布时间】:2017-03-29 00:26:50
【问题描述】:

我有以下 JSON 结构:

[{ "id":"10", "class": "child-of-9" }, { "id": "11", "classd": "child-of-10" }]

如何使用 JavaScript 对其进行迭代?

【问题讨论】:

标签: javascript json loops


【解决方案1】:

var arr = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "class": "child-of-10"}];
    
for (var i = 0; i < arr.length; i++){
  document.write("<br><br>array index: " + i);
  var obj = arr[i];
  for (var key in obj){
    var value = obj[key];
    document.write("<br> - " + key + ": " + value);
  }
}

注意:for-in 方法对于简单对象来说很酷。与 DOM 对象一起使用不是很聪明。

【讨论】:

  • 不要忘记在 for key in obj 循环中检查 obj.hasOwnProperty(key) --- 否则有一天你可能会发现其他不想要的键进入 obj,例如,如果有人扩展原型......
  • 嗨,我能问一下我是否想用它来获取远程 json 数组,我该怎么做?请给我一些指导!
  • @AlexanderSupertramp 它是使用数组文字表示法和对象文字表示法中的对象设置的。在 JavaScript 中,数组本质上也是对象。所以我仍然会参考使用 JSON 设置的 arr。
  • @musicformellons 请参阅developer.mozilla.org/en/docs/Web/JavaScript/Reference/… 了解现代方法(IE 不支持)。
  • 绝不——绝不! - 使用 for...in-loop 枚举数组。
【解决方案2】:

取自jQuery docs

var arr = [ "one", "two", "three", "four", "five" ];
var obj = { one:1, two:2, three:3, four:4, five:5 };

jQuery.each(arr, function() {
  $("#" + this).text("My id is " + this + ".");
  return (this != "four"); // will stop running to skip "five"
});

jQuery.each(obj, function(i, val) {
  $("#" + i).append(document.createTextNode(" - " + val));
});

【讨论】:

  • 这是一个非常混乱的语法。你能解释一下吗?能否也提供一下输出?
  • 答案应该在 JavaScript 中给出,而不是在 JQuery 中。
  • @WayneHartman 我赞同您的观点,但最初的问题确实是“jquery 或 javascript”。似乎错误在于问题上没有 jquery 标记。
  • 同样,lodash 提供_.forEach(别名_.each for underscore compatibility)来完成同样的任务。
  • OP 要求 jQuery 或 JavaScript,所以答案适合我的书。
【解决方案3】:

使用for...of

var mycars = [{name:'Susita'}, {name:'BMW'}];

for (var car of mycars) 
{
  document.write(car.name + "<br />");
}

结果:

Susita
BMW

【讨论】:

  • Susita 是一个文化因变量,对吧? :-)
  • 对,一个顶级变量,比如BMW ;-)
  • 这是一个常规数组,不是 JSON。
  • @SachinPrasad 不,i 是属性名称。
  • 适用于数组和 jsons。
【解决方案4】:

如果不容易,请告诉我:

var jsonObject = {
  name: 'Amit Kumar',
  Age: '27'
};

for (var prop in jsonObject) {
  alert("Key:" + prop);
  alert("Value:" + jsonObject[prop]);
}

【讨论】:

  • 您的 jsonObject 不是真正的 JSON 对象。它是一个 javascript 对象。这就是为什么它有效。但是,如果有人有 JSON 对象,他可以将其转换为 JS 对象,然后使用您的方法。要将 JSON 对象转换为 JS 对象,请使用 jsObject = JSON.parse(jsonObject);
  • 如果你已经通过 jQuery.getJSON() 获取了你的数据,那么这很好。
【解决方案5】:

如果这是你的dataArray:

var dataArray = [{"id":28,"class":"Sweden"}, {"id":56,"class":"USA"}, {"id":89,"class":"England"}];

然后:

$(jQuery.parseJSON(JSON.stringify(dataArray))).each(function() {  
         var ID = this.id;
         var CLASS = this.class;
});

【讨论】:

  • 使用 JQuery 的最佳答案。我使用 AJAX 对来自后端的数据进行编码,所以我没有使用“stringify”函数。代码清晰美观!
【解决方案6】:

http://www.w3schools.com复制粘贴,不需要JQuery开销。

var person = {fname:"John", lname:"Doe", age:25};

var text = "";
var x;
for (x in person) {
    text += person[x];
}

结果:John Doe 25

【讨论】:

    【解决方案7】:

    mootools 示例:

    var ret = JSON.decode(jsonstr);
    
    ret.each(function(item){
        alert(item.id+'_'+item.classd);
    });
    

    【讨论】:

      【解决方案8】:

      你可以使用像 objx 这样的迷你库 - http://objx.googlecode.com/

      你可以这样写代码:

      var data =  [ {"id":"10", "class": "child-of-9"},
                    {"id":"11", "class": "child-of-10"}];
      
      // alert all IDs
      objx(data).each(function(item) { alert(item.id) });
      
      // get all IDs into a new array
      var ids = objx(data).collect("id").obj();
      
      // group by class
      var grouped = objx(data).group(function(item){ return item.class; }).obj()
      

      还有更多“插件”可让您处理此类数据,请参阅http://code.google.com/p/objx-plugins/wiki/PluginLibrary

      【讨论】:

        【解决方案9】:

        使用嵌套对象,可以通过递归函数检索:

        function inside(events)
          {
            for (i in events) {
              if (typeof events[i] === 'object')
                inside(events[i]);
              else
              alert(events[i]);
            }
          }
          inside(events);
        

        其中 events 是 json 对象。

        【讨论】:

        • 太棒了。只是提到它;如果你读出 (i) 变量,你可以得到属性名称(对于它的价值)
        【解决方案10】:

        Marquis Wang's 可能是使用 jQuery 时的最佳答案。

        在纯 JavaScript 中,使用 JavaScript 的 forEach 方法有一些非常相似的东西。 forEach 将函数作为参数。然后将为数组中的每个项目调用该函数,并将所述项目作为参数。

        简短易懂:

        var results = [ {"id":"10", "class": "child-of-9"}, {"id":"11", "classd": "child-of-10"} ];
        
        results.forEach(function(item) {
            console.log(item);
        });

        【讨论】:

        • 不错的单行示例。可以在此之上添加的东西是箭头功能,例如-results.forEach((item) =&gt; console.log(item));
        【解决方案11】:

        这是一个纯注释的 JavaScript 示例。

          <script language="JavaScript" type="text/javascript">
          function iterate_json(){
                    // Create our XMLHttpRequest object
                    var hr = new XMLHttpRequest();
                    // Create some variables we need to send to our PHP file
                    hr.open("GET", "json-note.php", true);//this is your php file containing json
        
                    hr.setRequestHeader("Content-type", "application/json", true);
                    // Access the onreadystatechange event for the XMLHttpRequest object
                    hr.onreadystatechange = function() {
                        if(hr.readyState == 4 && hr.status == 200) {
                            var data = JSON.parse(hr.responseText);
                            var results = document.getElementById("myDiv");//myDiv is the div id
                            for (var obj in data){
                            results.innerHTML += data[obj].id+ "is"+data[obj].class + "<br/>";
                            }
                        }
                    }
        
                    hr.send(null); 
                }
        </script>
        <script language="JavaScript" type="text/javascript">iterate_json();</script>// call function here
        

        【讨论】:

          【解决方案12】:

          var jsonString = `{
              "schema": {
                  "title": "User Feedback",
                  "description": "so",
                  "type": "object",
                  "properties": {
                      "name": {
                          "type": "string"
                      }
                  }
              },
              "options": {
                  "form": {
                      "attributes": {},
                      "buttons": {
                          "submit": {
                              "title": "It",
                              "click": "function(){alert('hello');}"
                          }
                      }
                  }
              }
          }`;
          
          var jsonData = JSON.parse(jsonString);
          
          function Iterate(data)
          {
              jQuery.each(data, function (index, value) {
                  if (typeof value == 'object') {
                      alert("Object " + index);
                      Iterate(value);
                  }
                  else {
                      alert(index + "   :   " + value);
                  }
              });
          }
          
          Iterate(jsonData);
          &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"&gt;&lt;/script&gt;

          【讨论】:

          • 你应该解释你的代码。没有解释的答案没有多大帮助。
          【解决方案13】:

          浏览 JSON 文档的另一种解决方案是 JSONiq(在 Zorba 引擎中实现),您可以在其中编写如下内容:

          jsoniq version "1.0";
          
          let $doc := [
            {"id":"10", "class": "child-of-9"},
            {"id":"11", "class": "child-of-10"}
          ]
          for $entry in members($doc)             (: binds $entry to each object in turn :)
          return $entry.class                     (: gets the value associated with "class" :)
          

          你可以在http://try.zorba.io/上运行它

          【讨论】:

            猜你喜欢
            • 2019-11-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-09-15
            • 2016-01-22
            • 2023-03-13
            • 1970-01-01
            相关资源
            最近更新 更多