In mijn code heb ik een aantal woordenboeken (zoals voorgesteld hier) die String geïndexeerd is. Omdat dit een beetje een geïmproviseerd type is, vroeg ik me af of er suggesties zijn over hoe ik door elke sleutel (of waarde, alles waar ik de sleutels voor nodig heb) zou kunnen lopen. Alle hulp wordt gewaardeerd!
myDictionary: { [index: string]: any; } = {};
Antwoord 1, autoriteit 100%
Gebruik een for in
lus om de sleutel/waarden te herhalen:
for (let key in myDictionary) {
let value = myDictionary[key];
// Use `key` and `value`
}
Antwoord 2, autoriteit 69%
< ES 2017:
Object.keys(obj).forEach(key => {
let value = obj[key];
});
>= ES 2017:
Object.entries(obj).forEach(
([key, value]) => console.log(key, value)
);
Antwoord 3, autoriteit 26%
Wat dacht je hiervan?
for (let [key, value] of Object.entries(obj)) {
...
}
Antwoord 4, autoriteit 14%
Er is één voorbehoud bij de sleutel/waarde-lus die Ian noemde. Als het mogelijk is dat de objecten kenmerken hebben die aan hun prototype zijn gekoppeld, en wanneer u de operator in
gebruikt, worden deze kenmerken opgenomen. U wilt er dus zeker van zijn dat de sleutel een attribuut is van uw instantie en niet van het prototype. Oudere IE’s staan erom bekend dat indexof(v)
als sleutel wordt weergegeven.
for (const key in myDictionary) {
if (myDictionary.hasOwnProperty(key)) {
let value = myDictionary[key];
}
}
Antwoord 5, autoriteit 5%
Kortste manier om alle woordenboek-/objectwaarden te krijgen:
Object.keys(dict).map(k => dict[k]);
Of op deze manier:
Object.entries(dict).map([k,v] => /* ... */);
Antwoord 6
Als u alleen voor in
een object zonder if-statement hasOwnProperty
gebruikt, krijgt u een foutmelding van linter zoals:
for (const key in myobj) {
console.log(key);
}
WARNING in component.ts
for (... in ...) statements must be filtered with an if statement
Dus de oplossing is om in plaats daarvan Object.keys
en of
te gebruiken.
for (const key of Object.keys(myobj)) {
console.log(key);
}
Ik hoop dat dit iemand helpt die een linter gebruikt.
Antwoord 7
Het antwoord van Ians is goed, maar je moet const gebruiken in plaats van let voor de sleutel, omdat deze nooit wordt bijgewerkt.
for (const key in myDictionary) {
let value = myDictionary[key];
// Use `key` and `value`
}
Antwoord 8
Met es2019is dit nu nog eenvoudiger:
- We kunnen
of
systematisch - Je hoeft het woordenboek niet langer in te vullen met
Object.entries
. gebruiken
Voorbeeld:
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)
}
Uitvoer:
3 7
4 12
Antwoord 9
Om de sleutels te krijgen:
function GetDictionaryKeysAsArray(dict: {[key: string]: string;}): string[] {
let result: string[] = [];
Object.keys(dict).map((key) =>
result.push(key),
);
return result;
}
Antwoord 10
dit is mijn functie, ik hoop dat dit helpt
function recordToArray<TypeOfSchema>(
data: Record<string, TypeOfSchema>
): Array<TypeOfSchema> {
return Object.keys(data).map((key: string) => ({ id: key, ...data[key] }));
}