283

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

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

10 回答 10

394

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

for (let key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
于 2013-04-23T16:42:17.290 回答
272

< ES 2017 :

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

>= ES 2017

Object.entries(obj).forEach(
  ([key, value]) => console.log(key, value)
);
于 2016-10-15T05:59:56.560 回答
102

这个怎么样?

for (let [key, value] of Object.entries(obj)) {
    ...
}
于 2017-06-21T17:50:16.893 回答
54

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

for (const key in myDictionary) {
    if (myDictionary.hasOwnProperty(key)) {
        let value = myDictionary[key];
    }
}
于 2013-04-23T17:08:32.027 回答
21

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

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

或者这种方式:

Object.entries(dict).map([k,v] => /* ... */);
于 2019-08-18T19:40:32.277 回答
4

如果你只是为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。

于 2020-08-14T06:37:42.367 回答
2

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

for (const key in myDictionary) {
    let value = myDictionary[key];
    // Use `key` and `value`
}
于 2020-06-17T18:37:22.853 回答
1

使用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
于 2021-12-08T01:23:40.217 回答
0

要获取密钥:

function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
  let result: string[] = [];
  Object.keys(dict).map((key) =>
    result.push(key),
  );
  return result;
}
于 2020-04-24T23:06:49.840 回答
0

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

function recordToArray<TypeOfSchema>(
  data: Record<string, TypeOfSchema>
): Array<TypeOfSchema> {
  return Object.keys(data).map((key: string) => ({ id: key, ...data[key] }));
}
于 2021-06-22T08:46:13.187 回答