TypeScript,通过字典循环

ben*_*657 150 javascript html5 typescript

在我的代码中,我有几个字典(如此处所示),它是String索引的.由于这是一个临时类型,我想知道是否有任何建议我将如何能够遍历每个键(或值,无论如何我都需要键).任何帮助赞赏!

myDictionary: { [index: string]: any; } = {};
Run Code Online (Sandbox Code Playgroud)

Ian*_*Ian 241

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

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
Run Code Online (Sandbox Code Playgroud)

  • @DonHatch一般来说它实际上非常安全.在非常特殊的情况下(例如,当您包含错误地修改原型的库或者故意不正确地修改原型时),这是不安全的.由开发人员决定是否使用最不可能不必要的检查来膨胀他们的代码 (12认同)
  • 这一般不安全; 它需要hasOwnProperty测试(如Jamie Stark的答案)或其他东西. (7认同)
  • 我们已经有了es6和TypeScript.为什么编写hasOwnProperty的问题一直没有解决?即使在2017年,所有人都关注JS.我很失望. (7认同)
  • @Ian问题是有太多的库会修改对象原型.当存在更好的简单替代方案时,提倡这种类型的模式似乎是一个坏主意,例如`Object.keys(target).forEach(key => {let value = target(key);/*Use key,value here*/});`.如果你必须展示这种方法,至少要为那些还不了解的人提及风险和更好的选择. (5认同)
  • 使用地图:`Object.entries(obj).map(([key, val]) => console.log(key, '=>', val));` (3认同)
  • @Yiping Nope,但这对我来说很有帮助 (2认同)

Ste*_*aul 127

@Alcesem几乎是正确的,除了该方法的好处是不需要包含__CODE__守卫,__CODE__因为迭代器不会进一步搜索原型链.因此,以下不仅对字典安全,而且对Typescript和Javascript中的任何类型的对象都是安全的.

<ES 2017:

Object.keys(obj).forEach(key => {
  let value = obj[key];
});
Run Code Online (Sandbox Code Playgroud)

> = ES 2017:

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value);
);
Run Code Online (Sandbox Code Playgroud)

  • 请参阅[此处](http://stackoverflow.com/a/39815452/968003)如何使“Object.entries”在 TypeScript 中工作 (2认同)

Rad*_*ugh 51

这个怎么样?

for (let [key, value] of Object.entries(obj)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该在顶部。它很干净,看起来像一个循环应该看起来,并且它不会迭代原型链。 (2认同)

Jam*_*rke 49

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

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 事实上,对于当前版本的类型脚本,`key`和`value`可以是`const`. (3认同)
  • 不试图拆分头发,但既然我们正在谈论类型脚本,你不应该使用let键而不是var键吗?很好的回答谢谢. (2认同)
  • 最好不要从目标对象调用 `hasOwnProperty` 检查,而是执行以下操作: `...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...` 否则,如果您将 eslint 与`no-prototype-builtins` 规则,它会发出错误。 (2认同)

k06*_*06a 13

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

Object.keys(dict).map(k => dict[k]);
Run Code Online (Sandbox Code Playgroud)

或者这种方式:

Object.entries(dict).map([k,v] => /* ... */);
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

223797 次

最近记录:

5 年,9 月 前