2013-06-18 57 views
0

这是我的JS( “数据” 是从JSON调用):JSON遍历嵌套数组

if (data.projectReports.length) { 
    for (var i in data.projectReports){ 
    var report = data.projectReports[i]; 
    $('#reports').append(
     '<div class="report-description">' + 
      '<h2>' + report.header + '</h2>' + 
      '<p>' + report.text + '</p>' + 
     '</div>' + 
     '<ul class=\"report-moreinfo\">' + 

      // I want to loop through "persons" here. 

     '</ul>' 
    ); 
    } 
} else 

. . . 

这是我的JSON:

{ 
    "projectReports":[ 
    { 
     "header":"Headline", 
     "text":"Description of item", 
     "estimate":10, 
     "actual":7, 
     "persons":{ 
     "Robert":5, 
     "Erik":10, 
     "Juan":3 
     } 
    } 
    ] 
} 

我是新来的JSON和搜索之后作为回答,实际上找到了几个不同的答案,出现了新问题,所以我想我会在这里发布整个问题。

评论是在我的JavaScript代码中,我想通过report.persons循环。

在我发现的所有解决方案中,他们可以直接指向“标题”或“文本”,就像我以前做过的那样,但在这种情况下,我只是拥有一个键和值。我会如何去做这样的事情?

<li><p> persons.key </p><p> persons.value </p></li> 

我明白,我将不得不做另一个for循环,但我的知识是不够好,能够找出我自己如何构建它。

+1

'for(var i in report.persons){'?无论如何,你不能通过一个字符串声明中的对象循环! –

+0

为什么你有财产'人'作为一个对象,而不是一个数组持有对象? – Zim84

+1

可能的重复[如何枚举JavaScript对象的属性?](http://stackoverflow.com/questions/85992/how-do-i-enumerate-the-properties-of-a-javascript-object) –

回答

0

为了您的代码,我会用通过reports.persons循环和函数返回你所需要的:

var showPersons = function(persons){ 
    var appendedData = ''; 
    for (var person in persons) { 
    if (!persons.hasOwnProperty(person)) continue; 
    appendedData += '<li><p>' + person + '</p><p>' + persons[person] +'</p></li>' 
    } 
    return appendedData; 
}; 

现在你可以用它来追加<ul>标签里面所有的东西:

listPersons(report.persons); 

如果你想要的代码读取更接近你想要的(并且能够使用person.nameperson.value),你会需要具有这种格式的JSON:

{ 
    "projectReports": [ 
     { 
      "header": "Headline", 
      "text": "Description of item", 
      "estimate": 10, 
      "actual": 7, 
      "persons": [ 
       { 
        "name": "Robert", 
        "value": 5 
       }, 
       { 
        "name": "Erik", 
        "value": 10 
       }, 
       { 
        "name": "Juan", 
        "value": 3 
       } 
      ] 
     } 
    ] 
} 
+0

非常感谢!这工作完美。 –

1

这是非常基本的东西

var personsMarkup = ""; 
for (var i in persons){ 
    if (persons.hasOwnProperty(i)){ 
    console.log(i);   // the key 
    console.log(persons[i]); // the value 
    // cancat this all together 
    personsMarkup =+ "<li><p>"+i+"</p><p>"+persons[i]+"</p></li>"; 
    } 
} 

然后:

$('#reports').append(
    /* ... */ 
    '<ul class=\"report-moreinfo\">' + 
    personsMarkup + 
    '</ul>'; 
    /* ... */ 
); 
0
$('#reports').append(
    '<div class="report-description">' + 
     '<h2>' + report.header + '</h2>' + 
     '<p>' + report.text + '</p>' + 
    '</div>' + 
    '<ul class=\"report-moreinfo\">'); 
for (var personKey in report.persons){ 
    $('#reports').append('<li><p>' + personKey + '</p><p>' + report.persons[personKey] + '</p></li>'); 
} 
$('#reports').append(
    '</ul>' 
); 
+0

你应该使用'person'而不是'person.key'和'report.persons [person]'而不是'person.value'。 –

+0

@RafałRutkowski你是对的。固定。 –