【问题标题】:TypeScript, Looping through a dictionaryTypeScript,遍历字典
【发布时间】:2013-04-16 22:52:16
【问题描述】:

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

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

【问题讨论】:

  • 你试过了吗:for (var key in myDictionary) { }?在循环内部,您将使用 key 获取密钥,并使用 myDictionary[key] 获取值
  • @Ian 刚试过,好像不行。没有错误,但语句中没有运行
  • @Ian Ah 抱歉,其他地方的一些代码弄乱了它。这完美!是否愿意将其作为答案,以便我可以选择?

标签: javascript html typescript


【解决方案1】:

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

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

【讨论】:

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

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

>= ES 2017

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

【讨论】:

  • 这是我一直在寻找的解决方案,因为它可以让我在迭代之前对键进行排序
  • 查看 here 如何使 Object.entries 在 TypeScript 中工作
【解决方案3】:

这个怎么样?

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

【讨论】:

  • 它需要 tsconfig 中的 lib es2017。见stackoverflow.com/questions/45422573/…
  • 这是我需要通过 obj[key] "No index signature..." 上的 Typescript 错误,因为我明确地将我的 obj 类型设置为 { [key: string]: string } 和不想使用 { [key: string]: any }。有了这个,我就可以访问“价值”。谢谢
  • 如果您想完全忽略key,只需将其留空:[ , value]。 (感谢this issue comment。)
  • 这是迄今为止我发现的唯一有效的方法来遍历非字符串键索引类型
  • 这应该在顶部。它很干净,看起来应该是一个循环,并且它不会遍历原型链。
【解决方案4】:

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

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

【讨论】:

  • 不是想分裂头发,但是既然我们在谈论类型脚本,你不应该使用 let 键而不是 var 键吗?很好的回答谢谢。
  • 事实上,使用当前版本的类型脚本keyvalue 可以是const
  • 最好不要从目标对象调用hasOwnProperty检查,而是这样做:...if (Object.prototype.hasOwnProperty.call(myDictionary, key))...否则,如果您使用带有no-prototype-builtins规则的eslint,它将发出错误。
【解决方案5】:

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

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

或者这样:

Object.entries(dict).map([k,v] => /* ... */);

【讨论】:

    【解决方案6】:

    如果您只是针对 in 一个没有 if 语句 hasOwnProperty 的对象,那么您将收到来自 linter 的错误,例如:

    for (const key in myobj) {
       console.log(key);
    }
    
    WARNING in component.ts
    for (... in ...) statements must be filtered with an if statement
    

    所以解决方案是改用Object.keysof

    for (const key of Object.keys(myobj)) {
       console.log(key);
    }
    
    

    希望这个帮手有人使用 linter。

    【讨论】:

      【解决方案7】:

      Ians 答案很好,但您应该使用 const 而不是 let 作为密钥,因为它永远不会更新。

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

      【讨论】:

        【解决方案8】:

        使用 es2019,现在变得更加简单:

        1. 我们可以使用of系统
        2. 不再需要用Object.entries包装字典

        例子:

        let someMap: Map<number, number> = new Map()
        someMap.set(3, 7);
        someMap.set(4, 12);
        for (let [key, value] of someMap) {
            console.log(key, value)
        }
        

        输出:

        3 7
        4 12
        

        【讨论】:

          【解决方案9】:

          获取密钥:

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

          【讨论】:

            【解决方案10】:

            这是我的功能,希望对你有帮助

            function recordToArray<TypeOfSchema>(
              data: Record<string, TypeOfSchema>
            ): Array<TypeOfSchema> {
              return Object.keys(data).map((key: string) => ({ id: key, ...data[key] }));
            }
            

            【讨论】:

              猜你喜欢
              • 2019-09-24
              • 2015-08-07
              • 2010-11-20
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多