Object.keys, values, entries

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}

Object.keys/values/entries negeren symbolische eigenschappen

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:

  1. Gebruik Object.entries(obj) om een array van sleutel/waarde paren uit obj te halen.
  2. Gebruik array methoden op die array, bijv. map.
  3. 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.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.