Object.keys, values, entries

Lad os gå væk fra de enkelte datastrukturer og tale om iterationer over dem.

I det foregående kapitel så vi metoderne map.keys(), map.values(), map.entries().

Disse metoder er generiske, der er en fælles aftale om at bruge dem til datastrukturer. Hvis vi nogensinde opretter vores egen datastruktur, bør vi også implementere dem.

De understøttes for:

  • Map
  • Set
  • Array

Plainobjekter understøtter også lignende metoder, men syntaksen er en smule anderledes.

Object.keys, values, entries

For almindelige objekter er følgende metoder tilgængelige:

  • Object.keys(obj) – returnerer et array af nøgler.
  • Object.values(obj) – returnerer et array af værdier.
  • Object.entries(obj) – returnerer et array af par.

Bemærk forskellene (sammenlignet med f.eks. map):

Map Objekt
Syntaks for opkald map.keys() Object.keys(obj), men ikke obj.keys()
Returnerer iterable “ægte” Array

Den første forskel er, at vi skal kalde Object.keys(obj), og ikke obj.keys().

Hvorfor det? Den vigtigste grund er fleksibilitet. Husk, at objekter er en base for alle komplekse strukturer i JavaScript. Så vi kan have vores eget objekt som data, der implementerer sin egen data.values()-metode. Og vi kan stadig kalde Object.values(data) på det.

Den anden forskel er, at Object.*-metoder returnerer “rigtige” arrayobjekter, ikke bare en iterabel. Det er primært af historiske årsager.

For eksempel:

let user = { name: "John", age: 30};

  • Object.keys(user) =
  • Object.values(user) =
  • Object.entries(user) = , ]

Her er et eksempel på at bruge Object.values til at løbe over egenskabsværdier:

let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}

Objekt.keys/values/entries ignorerer symbolske egenskaber

Nøjagtig som en for..in-sløjfe ignorerer disse metoder egenskaber, der bruger Symbol(...) som nøgler.

Ofte er det praktisk. Men hvis vi også vil have symbolske nøgler, så er der en separat metode Object.getOwnPropertySymbols, der returnerer et array med kun symbolske nøgler. Desuden findes der en metode Reflect.ownKeys(obj), der returnerer alle nøgler.

Transformering af objekter

Objekter mangler mange metoder, der findes for arrays, f.eks. map, filter og andre.

Hvis vi gerne vil anvende dem, kan vi bruge Object.entries efterfulgt af Object.fromEntries:

  1. Brug Object.entries(obj) til at få et array af nøgle/værdipar fra obj.
  2. Brug arraymetoder på dette array, f.eks. map.
  3. Brug Object.fromEntries(array) på det resulterende array for at forvandle det tilbage til et objekt.

For eksempel har vi et objekt med priser, og vi vil gerne fordoble dem:

let prices = { banana: 1, orange: 2, meat: 4,};let doublePrices = Object.fromEntries( // convert to array, map, and then fromEntries gives back the object Object.entries(prices).map(() => ));alert(doublePrices.meat); // 8

Det kan se svært ud ved første øjekast, men bliver let at forstå, når man har brugt det en eller to gange. Vi kan lave kraftfulde kæder af transformationer på denne måde.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.