TypeScript, door een woordenboek bladeren

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 inlus 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 ingebruikt, 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 ineen object zonder if-statement hasOwnPropertygebruikt, 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.keysen ofte 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:

  1. We kunnen ofsystematisch
  2. . gebruiken

  3. Je hoeft het woordenboek niet langer in te vullen met Object.entries

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] }));
}

Other episodes