我有以下JSON:
{"data":[{"id":1,"client_id":1},{"id":2,"client_id":1}]}
我正在尝试for...in
,但事情进展不顺利。
看看我的代码:
for (post in data) {
console.log(post.client_id); //return undefined
}
但如果我这样做:
for (i=0 ; i<data.length; i++) {
console.log(data[i].client_id); //return the correct value
}
为什么我不能在这种情况下使用for..in
进行迭代?
答案 0 :(得分:2)
“data”属性的值是一个数组。你需要:
for (var i = 0; i < json.data.length; ++i)
console.log(json.data[i].client_id);
假设已经解析了JSON并将其存储在名为“json”的变量中。如果它实际上被称为“数据”,那么它将是“data.data”而不是“json.data”。
你真的不应该使用for ... in
循环来实现真正的数组。出于各种原因,这是一个坏习惯。使用数字索引或类似新浏览器中可用的.forEach()
工具。
答案 1 :(得分:1)
首先,您不应该使用for/in
迭代数组。该结构迭代对象的属性。您将获得所有数组元素,但您也可以获得该对象的其他可迭代属性。
数组应始终使用传统的for
循环进行迭代,如下所示:
for (var i = 0; i < arr.length; i++)
。
其次,您必须确保正确遵循自己的数据结构。你有这个:
var item = {"data":[{"id":1,"client_id":1},{"id":2,"client_id":1}]};
分散了更多看起来像这样:
var item = {
"data":[
{"id":1,"client_id":1},
{"id":2,"client_id":1}
]
};
因此,您的JSON是一个对象。该对象在其中有一个名为data
的属性,并且一个属性的值是一个包含对象的数组。你会得到数组中的第一项:
item.data[0]
或者该对象上的属性:
item.data[0].id
item.data[0].client_id
您将迭代该数组中的所有项目,如下所示:
for (var i = 0; i < item.data.length; i++) {
// access each object in the array
item.data[i].id
item.data[i].client_id
}
答案 2 :(得分:0)
它应该是这样的:
for (var post in data) {
console.log(data[post].client_id); //return undefined
}
这是使用for ... in
进行迭代的正确形式答案 3 :(得分:0)
for (post in data) {
console.log(post.client_id); //return undefined
}
你做错了,试试这样:
for (post in data) {
console.log(data[post].client_id); //return undefined
}
你实际上还应该包含一个过滤器,因为原型中的东西可以泄漏:
for (post in data) {
if (data.hasOwnProperty(post)) {
console.log(data[post].client_id); //return undefined
}
}
答案 4 :(得分:0)
这是因为你的JSON的结构。请注意,您的外部对象只有一个顶级属性:data
。
{ "data":
[
{"id":1,"client_id":1},
{"id":2,"client_id":1}
]
}
data
没有client_id
属性:它是您尝试迭代的子条目数组,那些有{{1}属性。这就是索引client_id
的循环有效的原因。