在我的代码中,我有几个字典(如这里所建议的),它们是字符串索引的。由于这是一种即兴的类型,我想知道是否有任何关于如何循环遍历每个键(或值,无论如何我都需要这些键)的建议。任何帮助表示赞赏!
myDictionary: { [index: string]: any; } = {};
在我的代码中,我有几个字典(如这里所建议的),它们是字符串索引的。由于这是一种即兴的类型,我想知道是否有任何关于如何循环遍历每个键(或值,无论如何我都需要这些键)的建议。任何帮助表示赞赏!
myDictionary: { [index: string]: any; } = {};
要遍历键/值,请使用for in
循环:
for (let key in myDictionary) {
let value = myDictionary[key];
// Use `key` and `value`
}
< ES 2017 :
Object.keys(obj).forEach(key => {
let value = obj[key];
});
>= ES 2017:
Object.entries(obj).forEach(
([key, value]) => console.log(key, value)
);
这个怎么样?
for (let [key, value] of Object.entries(obj)) {
...
}
Ian 提到的键/值循环有一个警告。如果对象可能具有附加到其原型的属性,并且当您使用in
运算符时,这些属性将被包括在内。因此,您需要确保键是实例的属性,而不是原型的属性。indexof(v)
较旧的 IE 以作为键出现而闻名。
for (const key in myDictionary) {
if (myDictionary.hasOwnProperty(key)) {
let value = myDictionary[key];
}
}
获取所有字典/对象值的最短方法:
Object.keys(dict).map(k => dict[k]);
或者这种方式:
Object.entries(dict).map([k,v] => /* ... */);
如果你只是为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.keys
而of
不是。
for (const key of Object.keys(myobj)) {
console.log(key);
}
希望这个帮手有人使用 linter。
Ians Answer 很好,但您应该使用 const 而不是 let 作为密钥,因为它永远不会更新。
for (const key in myDictionary) {
let value = myDictionary[key];
// Use `key` and `value`
}
使用es2019,现在变得更加简单:
of
系统的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
要获取密钥:
function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
let result: string[] = [];
Object.keys(dict).map((key) =>
result.push(key),
);
return result;
}
这是我的功能,我希望这有帮助
function recordToArray<TypeOfSchema>(
data: Record<string, TypeOfSchema>
): Array<TypeOfSchema> {
return Object.keys(data).map((key: string) => ({ id: key, ...data[key] }));
}