Javascript 对于对象中的对象中的循环

Javascript 对于对象中的对象中的循环,javascript,Javascript,有人能解释一下为什么这个不行吗 一个对象中有两个对象。我使用for循环逐个打印嵌套对象中的每个属性 var people = { john: { name: "John", age: 20 }, bob: { name: "Bob", age: 40 } }; for (var person in people) { for (var property in person) {

有人能解释一下为什么这个不行吗

一个对象中有两个对象。我使用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) 控制台到底是如何输出上述数字的?

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

for (var property in people[person]) { 
    console.log(property);
}
上面的数字对应于字符串值中的字符索引:

0: j    0: b
1: o    1: o
2: h    2: b
3: n

按照vision上面所说的方法打印属性,使用下面的方法获得实际VAL

您需要指定值,而不仅仅是索引,这正是for在中所做的。你需要像这样做

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

在中为..执行
时,您是在迭代键,而不是值

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);
    }
}

这不会打印他的预期输出,它会打印姓名和年龄,而不是单词“姓名”和“年龄”。是的,我一开始误解了这个问题。实际上,数字对应于
john
bob
的索引:-P@RocketHazmat啊,是的!我把一切都弄混了
:D