对象属性的Javascript for ..in

时间:2012-08-09 22:00:19

标签: javascript json

我有以下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进行迭代?

5 个答案:

答案 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的循环有效的原因。