2017-02-21 45 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