2013-04-23 140 views
75

在我的代碼中,我有幾個詞典(建議here),它是String索引的。由於這是一種即興類型,我想知道是否有任何關於如何能夠遍歷每個鍵(或值,我需要鍵的所有內容)的建議。任何幫助感謝!TypeScript,在字典中循環

myDictionary: { [index: string]: any; } = {}; 
+0

你試過了:for(var key in myDictionary){}'?在循環內部,你可以使用'key'來獲取密鑰,'myDictionary [key]'獲得值 – Ian 2013-04-23 16:15:19

+0

@Ian剛剛嘗試過,似乎沒有工作。沒有錯誤,但沒有在聲明中運行 – ben657 2013-04-23 16:21:33

+1

@Ian啊對不起,其他代碼中的一些代碼搞亂了它。這很好用!小心讓它成爲答案,以便我可以選擇它? – ben657 2013-04-23 16:38:52

回答

117

要遍歷所有的鍵/值,使用一個for in循環:

for (let key in myDictionary) { 
    let value = myDictionary[key]; 
    // Use `key` and `value` 
} 
+0

必須使用「key」作爲變量名嗎? – Yiping 2015-09-05 06:13:19

+2

@Yiping沒有,但它有助於使我清楚 – Ian 2015-09-05 14:52:13

+2

這是不安全的;它需要hasOwnProperty測試(如Jamie Stark的答案)或其他東西。 – 2016-02-03 19:30:22

33

有一個警告給密鑰/值循環伊恩提及。如果對象可能具有附加到其原型的屬性,並且使用運算符in時,將包含這些屬性。因此,您需要確保密鑰是實例的屬性,而不是原型的屬性。以舊版IEs爲indexof(v)顯示爲關鍵。

for (var key in myDictionary) { 
    if (myDictionary.hasOwnProperty(key)) { 
     var value = myDictionary[key]; 
    } 
} 
+2

不要試圖分割頭髮,但因爲我們正在談論類型腳本,不應該使用let key而不是var key嗎?很好的答案,謝謝。 – 2016-03-11 01:03:01

+1

事實上,在當前版本的腳本中,'key'和'value'可以是'const'。 – 2017-03-03 05:19:19

41

@Alcesem有它差不多吧,只是這種方法的好處是,一個並不需要包括hasOwnProperty()後衛Object.keys因爲迭代器不會再進一步​​向上搜索原型鏈。因此,以下內容不僅對字典安全,而且對於Typescript和Javascript中的任何類型的對象都是安全的。

< ES 2017年

Object.keys(obj).forEach(key => { 
    let value = obj[key]; 
}); 

> = ES 2017年

Object.entries(obj).forEach(
    ([key, value]) => console.log(key, value) 
); 
+0

這是我正在尋找的解決方案,因爲它可以讓我在迭代 – Andrew 2016-10-18 15:57:16

+0

FYI之前對鍵進行排序,目前這不支持TypeScript操場。 – Seanny123 2017-01-18 12:28:37

+1

請參見[這裏](http://stackoverflow.com/a/39815452/968003)如何使Object.entries在TypeScript中工作 – 2017-03-21 23:29:37

8

這個怎麼樣?

for (let [key, value] of Object.entries(obj)) { 
    ... 
}