我打算问一个问题,为什么它不起作用。但是当我评论代码时,我意识到我可以访问文本数组样式,item
给了我索引。我花了一段时间才发现这是解决方案,但我宁愿在for循环中使用item.text
。这是[我发布的答案]在Javascript中循环JSON对象的有效方法吗?
答案 0 :(得分:2)
There's no such thing as a JSON object - 一旦你解析了你的JSON(这是一个字符串),你最终只会得到一个对象。或者数组。
无论如何,要遍历一个对象数组,请使用传统的for
循环。 for..in
循环可能有效,但不建议使用它,因为它可能会循环遍历非数字属性(如果有人一直在搞乱内置数组)。
在您的具体情况下,如果obj.body.items
是一个数组,那么请执行以下操作:
for (var i = 0; i < obj.body.items.length; i++) {
// obj.body.items[i] is current item
console.log(obj.body.items[i].text);
}
你可以说,通过直接保持对数组的引用而不是每次都通过整个obj.body.
链访问它来使代码更整洁:
var items = obj.body.items;
for (var i = 0; i < items.length; i++) {
console.log(items[i].text);
}
“我宁愿在for循环中使用
item.text
”
在你的答案中 - 真的应该作为问题的一部分发布 - 因为你正在使用for..in
循环,你的item
变量依次被设置为每个索引作为字符串,例如,在第一次迭代时,它将是字符串"0"
,并且字符串没有text
属性,因此item.text
不起作用 - 尽管它应该给你{{1} },而不是undefined
。但你可以这样做:
null
也就是说,声明一个名为var item;
for (var i = 0; i < obj.body.items.length; i++) {
item = obj.body.items[i] // get current item
console.log(item.text); // use current item
}
的变量,您设置为在每次循环迭代开始时引用当前数组项。
答案 1 :(得分:0)
<script type="text/javascript">
...
obj = JSON.parse(xmlhttp.responseText);
// displays the object as expected
console.log(obj);
// display the string next as expected
console.log(obj.body.next);
// displays the text of the item as expected
console.log(obj.body.items[0].text);
for (var item in obj.body.items) {
// displays the index value of the item
console.log(item);
// displays null - WHAT?? HUH?
console.log(item.text);
// displays the text - finally
console.log(obj.body.items[item].text);
}
<script>