0

我有以下 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在这种情况下我不能迭代?

4

5 回答 5

2

“数据”属性的值是一个数组。你需要:

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()新浏览器中可用的工具。

于 2012-08-09T22:02:01.797 回答
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
}
于 2012-08-09T22:08:31.407 回答
0

它应该是这样的:

for (var post in data) {
      console.log(data[post].client_id); //return undefined
}

这是使用 for... 进行迭代的正确形式

于 2012-08-09T22:02:40.457 回答
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
    }
}
于 2012-08-09T22:02:47.647 回答
0

这是因为您的 JSON 的结构。请注意,您有一个只有一个顶级属性的外部对象:data.

{ "data":
    [
        {"id":1,"client_id":1},
        {"id":2,"client_id":1}
    ]
}

data没有client_id属性:它是您尝试迭代的子条目的数组,并且这些子条目具有属性client_id。这就是为什么您的索引循环data有效的原因。

于 2012-08-09T22:03:33.953 回答