TypeScript,遍历字典


184

在我的代码中,我有几个字典(按此处的建议)是用String索引的。由于这是一种临时类型,我想知道是否有关于如何循环遍历每个键(或值,无论如何我都需要这些键)的建议。任何帮助表示赞赏!

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

你有没有尝试:for (var key in myDictionary) { }?在循环内部,您将使用key获取密钥并myDictionary[key]获取值
Ian

@Ian刚刚尝试过,似乎没有用。没有错误,但是语句中没有任何内容
ben657

1
@Ian啊,对不起,其他地方的一些代码使它混乱了。很好用!愿意回答它,所以我可以选择它?
ben657

Answers:


294

要遍历键/值,请使用 for in循环:

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

8
一般来说,这并不安全;它需要hasOwnProperty测试(如Jamie Stark的回答)或其他方法。
唐·哈奇

20
@DonHatch一般来说,它实际上非常安全。在非常特殊的情况下(例如,当您包含错误修改原型的库或故意错误修改原型的库时),这是不安全的。由开发人员决定是否通过最可能不必要的检查来膨胀代码
Ian

1
@Ian-我的想法是,如果没有其他保障措施,我就不会使用它,因为这似乎是一个等待等待的事故,例如,如果代码找到了进入实用程序函数的路径,然后有人将该函数传递给了一个字典,而这不仅仅是一个对象,而是具有附加属性的对象。是的,正如您所说,开发人员应权衡这种情况的可能性和严重性。对我自己而言,最省心的方法是表现得好像在所有情况下都会发生这种情况,而无需考虑。
唐·哈奇

5
@Ian问题在于,有太多的库会修改对象原型。当存在更好的简单替代方案(例如)时,主张这种类型的模式似乎不是一个好主意Object.keys(target).forEach(key => { let value = target(key); /* Use key, value here */ });。如果您必须显示此方法,请至少对尚不了解的人提及风险和更好的选择。
Yona Appletree '16

8
我们已经有了es6和TypeScript。为什么一直没有解决hasOwnProperty的编写问题?即使在2017年,所有人都将注意力集中在JS上。我很失望
Gherman'9

169

<ES 2017

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

> = ES 2017

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

这是我一直在寻找的解决方案,因为它可以让我在迭代之前对键进行排序
Andrew

仅供参考,目前TypeScript游乐场不支持此功能。
Seanny123 '17

1
这里如何使Object.entries工作在打字稿
亚历克斯·克劳斯

这是完美的
Piyush Choudhary,

66

这个怎么样?

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

1
在tsconfig中需要lib es2017。见stackoverflow.com/questions/45422573/…–
斯特凡

这是我需要克服obj [key]“没有索引签名...”上的Typescript错误的原因,因为我将obj类型显式设置为{[key:string]:string},并且不想使用{[key:字符串]:任何}。这样我就可以访问“值”。谢谢
ggedde

如果您想完全忽略key,则将其留空:[ , value]。(感谢此问题的评论。)
Dominik

50

Ian提到的键/值循环有一个警告。如果对象可能具有附加到其原型的属性,并且当您使用in运算符时,将包括这些属性。因此,您将需要确保键是实例的属性,而不是原型的属性。较旧的IE以indexof(v)显示为密钥而闻名。

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}

2
不试图分裂头发,但是由于我们在谈论类型脚本,因此您不应该使用let键而不是var键吗?好的答案,谢谢。
路加·杜平

3
实际上,使用当前版本的type script keyvalue可以是const
Patrick Desjardins

最好不要hasOwnProperty从目标对象中调用检查,而是这样做:...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...否则,如果您将eslint与no-prototype-builtinsrule 一起使用,它将发出错误。
sceee

5

获取所有字典/对象值的最短方法:

Object.keys(dict).map(k => dict[k]);

0

要获取密钥:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}

0

Ians Answer是个不错的选择,但是您应该使用const而不是let作为密钥,因为它永远不会更新。

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.