在Javascript中循环对象内部的数组

Loop Through Array inside Object in Javascript

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Loop through Json object

1
2
3
4
5
6
7
8
9
10
11
12
{
 "data": [
    {
     "name":"Jen",
     "id":"1"
    },
    {
     "name":"Steve",
     "id":"8"
    }
  ]
}

我正在与之交互的服务器用上面的响应进行响应。

我正在尝试循环使用itenter code here,以获得for..in语句。

这就是我要做的:

1
2
3
for (var item in response.data) {
  console.log(item.name);
}

这不管用。怎么了?

谢谢你

在阅读评论后,我让它与以下内容一起工作:

1
2
3
for (var item in response.data) {
  console.log(response.data[item].name);
}

我得到了一份名单…

有人能仔细分析一下为什么会起作用吗?


data实际上是一个数组(由[]表示),而不是一个对象,因此您需要一个常规的for循环,而不是for in循环。

1
2
3
4
for (var i = 0; i<response.data.length; i++) {
  // use i as an array index
  console.log(response.data[i].name);
}

在javascript中,for in构造用于迭代对象属性,但为了迭代数组,通常使用增量for循环。


签出:为什么在数组迭代中使用"for…in"是一个坏主意?

for…in迭代对象属性的名称。数组项也被视为"属性",因此在迭代索引时(在您的情况下是0,1)。如您在使用response.data[0]时预期的那样,您将得到数组的第一个元素。


for..in不按特定顺序迭代对象的可枚举属性(您可能在不同的浏览器中获得不同的顺序)。数组只是一个普通的对象,具有特殊的长度方法和继承自array.prototype的简便方法(其中一些方法取决于特殊的长度属性)。对属性名可以使用的内容没有限制,它们不限于非负整数(注意,如果正确的名称不是有效的标识符,则必须使用方括号表示法来访问其值)。

数组的索引只是非负整数的字符串属性名(即纯对象属性名),因此for..in循环将迭代数字索引(同样,不一定是升序或降序)以及所有其他可枚举属性,包括[[Prototype]]链上的属性。因此,除非您希望包含继承的可枚举属性,否则始终建议在for..in中包含一个hasownProperty测试。

由于上述原因,使用从0array.length - 1的计数器迭代数组属性通常要好得多(因为长度总是比最后一个索引大一个)。

要测试"无特定顺序"语句,请在IE和其他浏览器中尝试以下操作,并注意不同的顺序:

1
2
3
4
5
6
7
var a = [];
a[2] = 2;
a[0] = 0;
a[3] = 3;
var b = [];
for (var i in a) b.push(a[i]);
alert(b);