4

有人可以解释为什么这不起作用吗?

我在一个对象中有两个对象。我使用 for 循环一个接一个地打印出嵌套对象中的每个属性。

var people = {
    john: {
        name: "John",
        age: 20
    },
    bob: {
        name: "Bob",
        age: 40
    }
};

for (var person in people) {
    for (var property in person) { 
        console.log(property);
    }
}

我希望它打印出来:

name
age
name
age

相反,我得到:

0
1
2
3
0
1
2

1)我做错了什么?

2)控制台究竟在做什么来输出上面的数字?

4

3 回答 3

9

这是因为在第二个(嵌套for循环中,您迭代了保存对象属性名称(而不是值!)字符串值 变量。您应该将其更改为:personpeoplepeople[person]

for (var property in people[person]) { 
    console.log(property);
}

上面的数字对应于字符串值中的字符索引:

0: j    0: b
1: o    1: o
2: h    2: b
3: n
于 2013-02-28T21:31:51.790 回答
2

当您执行 afor..in时,您正在迭代键,而不是值。

for (var person in people),person是一个字符串;每个键:"john""bob"

在第二个循环中,您正在迭代该字符串的所有属性,这会打印字符串中的“索引”(您可以访问像数组这样的字符串string[1])。

您需要先获取对象值,然后才能对其进行循环:

for (var person in people) {
    var thisPerson = people[person];
    for (var property in thisPerson) { 
        console.log(property);
    }
}
于 2013-02-28T21:34:14.317 回答
0

像上面所说的那样打印出属性,使用下面的来获取实际的值

您需要指定值,而不仅仅是 for in 所做的索引。你需要做类似的事情

for (var person in people) {
    for (var property in people[person]) { 
        console.log(people[person][property]);
    }
}
于 2013-02-28T21:32:19.240 回答