2013-04-23 137 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)) { 
    ... 
}