遍历对象数组

4
我有一个像这样的JSON字符串。
 var json =  '{ "Comments": 
    [
      { "Id" : 1,"Comment" : "Test comment","Name" : "Yogesh","Child" : 0},
      { "Id" : 2,"Comment" : "Test comment II","Name" : "Yogesh","Child" : 0}
    ] 
    }';

我正在尝试按以下方式迭代对象:

var parsedJSON = $.parseJSON(json);

var html = "";    
for (comment in parsedJSON.Comments) {
  html += "Id: " + comment.Id;
  html += "Comment: " + comment.Comment;
  html += "Name: " + comment.Name;
  html += "Child: " + comment.Child;
  html += "<br/>";
}

但是在for循环中,这里的comment变成了01,我指的是不是一个对象,而只是一个字符串,那么我该如何遍历这个数组呢?


1
你不是在迭代JSON,而是在迭代JavaScript数组。我已经相应地更正了你的问题。你应该使用for循环来实现。你也可以阅读一下JavaScript中的数组 - Felix Kling
5个回答

6
var json = '{ "Comments": [{ "Id" : 1,"Comment" : "Test comment","Name" : "Yogesh","Child" : 0},{ "Id" : 2,"Comment" : "Test comment II","Name" : "Yogesh","Child" : 0}] }';

var parsedJSON = $.parseJSON(json), // jsonData should json
    html = "",
    comments =parsedJSON.Comments; // keeping reference of parsedJSON and its an Array

// Here key will give 0, 1 etc ie. index of array

for (var key in comments) {
    html += "Id: " + comments[key].Id;
    html += "Comment: " + comments[key].Comment;
    html += "Name: " + comments[key].Name;
    html += "Child: " + comments[key].Child;
    html += "<br/>";
}

Demo


给出不工作的代码(ReferenceError: comments未定义),却没有任何解释?糟糕。 - Niet the Dark Absol
@Kolink:也许在 JavaScript 标签中,我们假定您具备纠正 JS 打字错误的基本知识 :) 我已将“;”更改为“,”以纠正声明错误。 - iCollect.it Ltd
+1 表示展示了一种有趣的替代基本 for-next 索引的方法。 - iCollect.it Ltd
此外,查看此解决方案的 forEach 版本:http://jsfiddle.net/Jrg2k/5/ - user2153497

2

您似乎误解了for..in循环的工作方式。 comment将迭代数组的键。无论如何,您不应该在数组上使用for..in,只能在对象上使用-即使这样也要小心。

var l = parsedJSON.Comments.length, i, comment;
for( i=0; i<l; i++) {
    comment = parseJSON.Comments[i];
    // do stuff with comment
}

我最初尝试了它,但是 parsedJSON.Comments 没有任何长度的定义。 - yogi

0

你可以尝试这个:

     var JsonData =  { "Comments":
        [
          { "Id" : 1,"Comment" : "Test comment","Name" : "Yogesh","Child" : 0},
          { "Id" : 2,"Comment" : "Test comment II","Name" : "Yogesh","Child" : 0}
        ]
        };

    var html = "";    
    for (var i = 0; i < JsonData.Comments.length; i++) {
      comment = JsonData.Comments[i];
      html += "Id: " + comment.Id;
      html += " Comment: " + comment.Comment;
      html += " Name: " + comment.Name;
      html += " Child: " + comment.Child;
      html += "<br/>";
    }

alert(html);

具体是什么出了问题呢?因为我测试过了,对我来说是可以工作的,这是我的测试链接:http://jsfiddle.net/VYTpG/。 - M. Abbas
实际上,你没有理解问题,我不是在谈论你拥有的JSON对象,而是在谈论一个JSON字符串,请参见http://jsfiddle.net/VYTpG/1/ 但无论如何,感谢你的帮助。 - yogi

0
你可以使用$.each:
var html = ""; 
$.each(parsedJSON.Comments, function(i, comment) {
   html += "Id: " + comment.Id;
   html += "Comment: " + comment.Comment;
   html += "Name: " + comment.Name;
   html += "Child: " + comment.Child;
   html += "<br/>";
}

或者,您可以使用$.map

var html = $.map(parsedJSON.Comments, function(comment, i) {
   return "Id: " + comment.Id +
          "Comment: " + comment.Comment +
          "Name: " + comment.Name +
          "Child: " + comment.Child + 
          "<br/>";
}).join('');

0

Comments 包含两个元素的数组。

{ "Comments" : [ { 1 }, { 2 }]  ...

所以您可以使用它进行访问

for (var i = 0, len = parsedJSON.Comments.length; i < len; i++) {
    html += "Id: " + parsedJSON.Comments[i].Id;
    html += "Comment: " + parsedJSON.Comments[i].Comment;
    html += "Name: " + parsedJSON.Comments[i].Name;
    html += "Child: " + parsedJSON.Comments[i].Child;
    html += "<br/>";
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接