Laten we eens wegstappen van de individuele datastructuren en het hebben over de iteraties erover.
In het vorige hoofdstuk zagen we methoden map.keys()
, map.values()
, map.entries()
.
Deze methoden zijn generiek, er is een gemeenschappelijke afspraak om ze te gebruiken voor datastructuren. Als we ooit een eigen datastructuur maken, moeten we ze ook implementeren.
Ze worden ondersteund voor:
Map
Set
Array
Plain objects ondersteunen ook soortgelijke methoden, maar de syntaxis is een beetje anders.
Object.keys, values, entries
Voor gewone objecten zijn de volgende methoden beschikbaar:
- Object.keys(obj) – geeft een array van sleutels terug.
- Object.values(obj) – geeft een array van waarden terug.
- Object.entries(obj) – geeft een array van
paren.
Let op de verschillen (vergeleken met bijvoorbeeld map):
Map | Object | |
---|---|---|
Call syntax | map.keys() |
Object.keys(obj) , maar niet obj.keys() |
Returns | iterable | “real” Array |
Het eerste verschil is dat we Object.keys(obj)
moeten aanroepen, en niet obj.keys()
.
Waarom? De belangrijkste reden is flexibiliteit. Vergeet niet, objecten zijn een basis van alle complexe structuren in JavaScript. Dus we kunnen een eigen object hebben zoals data
dat zijn eigen data.values()
methode implementeert. En we kunnen er nog steeds Object.values(data)
op aanroepen.
Het tweede verschil is dat Object.*
methoden “echte” array-objecten retourneren, niet alleen een iterable. Dat is vooral om historische redenen.
Voorbeeld:
let user = { name: "John", age: 30};
Object.keys(user) =
Object.values(user) =
Object.entries(user) = , ]
Hier volgt een voorbeeld van het gebruik van Object.values
om te lussen over de waarden van eigenschappen:
let user = { name: "John", age: 30};// loop over valuesfor (let value of Object.values(user)) { alert(value); // John, then 30}
Net als een for..in
-lus negeren deze methoden eigenschappen die Symbol(...)
als sleutel gebruiken.
Over het algemeen is dat handig. Maar als we ook symbolische sleutels willen, dan is er een aparte methode Object.getOwnPropertySymbols die een array van alleen symbolische sleutels teruggeeft. Ook bestaat er een methode Reflect.ownKeys(obj) die alle sleutels retourneert.
Objecten vervormen
Objecten missen veel methoden die wel voor arrays bestaan, bijv. map
, filter
en anderen.
Als we ze willen toepassen, dan kunnen we Object.entries
gebruiken, gevolgd door Object.fromEntries
:
- Gebruik
Object.entries(obj)
om een array van sleutel/waarde paren uitobj
te halen. - Gebruik array methoden op die array, bijv.
map
. - Gebruik
Object.fromEntries(array)
op de resulterende array om er weer een object van te maken.
Bij voorbeeld, we hebben een object met prijzen, en willen die verdubbelen:
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
Het ziet er op het eerste gezicht misschien moeilijk uit, maar wordt gemakkelijk te begrijpen nadat je het een of twee keer hebt gebruikt. We kunnen op deze manier krachtige ketens van transformaties maken.