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}
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
:
- Brug
Object.entries(obj)
til at få et array af nøgle/værdipar fraobj
. - Brug arraymetoder på dette array, f.eks.
map
. - 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.