2017-02-21 85 views
0

我试图访问for循环中的嵌套JavaScript对象。第一级别的对象显示得很好,但第二级别的对象显示为未定义。但是,如果我在循环之外执行此操作,对对象访问进行硬编码,它就可以正常工作。到底是怎么回事?在for循环中访问JavaScript对象返回undefined

这是我尝试访问的对象:

var groups = { 
    "group1": { 
    "sum": 25, 
    "count": 5 
    }, 
    "group3": { 
    "sum": 5, 
    "count": 5 
    } 
} 

明白我的意思在这里:https://jsfiddle.net/97o1jme2/

+0

代码应该在这里发布**。 – Pointy

回答

2

您使用for ... in

for...in语句迭代的以任意顺序排列对象的枚举属性。对于每个不同的属性,可以执行语句。

,让你与目标的关键变量,你迭代上。

然后你需要正确的access来对象,而不是group["sum"]groups一起使用的键。

groups[group]["sum"] 
//^^^^^^^^^^^ 

groups[group].sum 
//^^^^^^^^^^^ 

var groups = { group1: { sum: 25, count: 5 }, group3: { sum: 5, count: 5 } }, 
 
    group; 
 

 
for (group in groups) { 
 
    console.log("[Loop access] " + group + " - sum: " + groups[group].sum + " - count: " + groups[group].count); 
 
}

+0

谢谢你,这就像一个魅力。我想知道为什么会发生这种情况。我会假设循环变量将是Object类型,为什么它是一个字符串? – SoKeT

+0

,因为你正在迭代对象的键。 –

+1

'for..in'是**糟** ...使用'for..of'来代替... – KarelG

1

如果在循环执行console.log(group)你会看到,在每次迭代的group变量是不是你想要的object但它是一个简单字符串 - key of groups对象。然后您将通过循环内的groups[group]访问适当的对象。

编辑

为了确保您将获得正确的结果,我建议你在每次迭代

if (groups.hasOwnProperty(group)) { 
    // perform operation 
} 

执行循环中一些验证根据文档

hasOwnProperty()方法返回一个布尔值,指示对象是否具有指定的属性。

+0

我明白了,但我会假设循环变量的类型为Object,为什么它是一个String ? – SoKeT

+0

因为它遍历给定对象的属性,所以它是如何实现的。 – piotrbienias