array functies
Bij de introductie van ES6 werden er ook een boel extra array functies toegegvoegd. Deze maken het werken met arrays nog interessanter. Hieronder zien we een paar veel voorkomende functies:
spread operator
Een array is geen primitief object. Wanneer je een array kopieert, dan kopieer het het adres.
Wanneer we de inhoud willen kopieren in een nieuwe array maken we gebruik van de spread operator:
De spread operator wordt voorgesteld door 3 punten: ...
. Je plaatst de 3 punten voor de naam van een variabel die een array bevat. Dit vervangt bv. ...arr1
door 1,2,3,4
.
Op deze manier kan je ook verschillende arrays samenvoegen:
Of gewoon de elementen van een array tussen andere elementen plaatsen van een nieuwe array:
loops
Zoals we al gezien hebben, kunnen we makkelijk loopen door een array a.d.h.v. zijn index. Een simpele for-lus waar we een variabel optellen laat ons toe elk element van de array aan te spreken.
Array objecten hebben zelf een functie die toelaat elk element apart in een lus aan te spreken: forEach
:
forEach()
verwacht een callback-functie met 1 parameter. Die parameter stelt elk element voor van de array. In het voorbeeld hierboven zal de callback functie e => console.log(e)
dus voor elk element e uitgevoerd worden dat in de array numbers zit.
sort
We kunnen de inhoud van een array ook sorteren:
Sort past dus de inhoud van een array aan! Wanneer we de originele array niet willen aanpassen, kunnen we gebruik maken van een spread operator:
We moeten wel opletten met de default sort functie te gebruiken:
Waarden worden omgezet naar strings. Dit kan problemen geven wanneer we getallen willen sorteren. Wil je zeker zijn dat jouw sort correct wordt uitgevoerd, dan geef je een callback mee aan de sort functie die exact bepaalt hoe er moet gesorteerd worden:
sortingnumbers
bepaalt nu hoe we sorteren. De callback zal alle elementen met mekaar vergelijken a.d.h.v. deze functie: a en b zullen dus door alle waarden van de array gaan.
De regels voor de callback functie zijn als volgt:
neem variabele a en b
sorteerfunctie moet < 0 teruggeven als a < b
sorteerfunctie moet > 0 teruggeven als a > b
sorteerfunctie moet 0 teruggeven als a === b
Bovenstaand voorbeeld kunnen we ook verkorten als volgt:
Of nog korter (probeer zelf eens te zoeken waarom dit werkt):
We kunnen dus ook objecten sorteren!
Hierboven sorteren we op de naam property van elk object. Let op dat we naar Uppercase omzetten om zodat bv. "Mabel" niet voor "abe" zou komen.
Willen we toch op leeftijd sorteren? Dan passen we de callback aan:
filter
We kunnen ook een nieuwe array maken met een subset van de elementen van de originele array. Hierboven halen we alle even elementen uit de array. Weeral hebben we een extra array op voorhand nodig en gebruiken we forEach
om door de array te loopen.
De filter methode van een array laat ons toe dit te verkorten. Filter verwacht een callback functie waarvan de parameter elk element van de array voorstelt. De filter functie geeft weeral een array terug. De return waarde van de callback moet een boolean zijn: als e=>{} true geeft, dan zal e in de nieuwe array zitten. Als e=>{} false geeft, dan wordt het element niet in de nieuwe array gestoken. De code hierboven kunnen we dus vervangen met:
Of nog korter:
map
Soms willen we een bewerking doen op de elementen van een array. Door te lopen door een array kunnen we een nieuwe array maken met nieuwe elementen gebaseerd op een bewerking op de originelen:
Hier spreken we van "mapping" van waarden op anderen. Let op: we hebben hier een nieuwe array nodig waarin we de "mapped" elementen kopiëren.
Arrays hebben hier een speciale functie voor. De map functie:
Het resultaat is hetzelfde als het vorige voorbeeld. De map-functie verwacht een callback die weeral elk element aanspreekt van de array. De return waarde van map is een nieuwe array. De elementen van deze nieuwe array zijn het resultaat van elke oproep naar de callback. In het voorbeeld hierboven worden alle elementen maal 2 gedaan.
chains
We kunnen de return waarden van array functies ook aan mekaar doorgeven. Dit doen we door "chains". Bv. wanneer we 2 maps na mekaar willen doen:
De langere versie:
Hier hangen we een filter aan een map. Eerst wordt de filter uitgevoerd. Op het resultaat hiervan doen we dan een map:
Let op, de volgorde is belangrijk. Probeer zelf eens map en filter om te draaien en kijk naar het resultaat.
Hier doen we een filter, dan een map, en dan filteren we dat resultaat nog eens:
Er is dus geen limiet op het aantal methodes dat je zo aan mekaar kan hangen.
reduce
Stel we willen alle getallen van een array optellen. Een logische oplossing is de volgende:
Wat als we eerst wat willen filteren. Dat kan bv. door:
Arrays hebben nog een functie: reduce
. Deze functie laat toe om de array te "reduceren" naar een bepaalde waarde of object. Het som-voorbeeld kunnen we herschrijven als:
Reduce verwacht 2 parameters:
een functie met twee parameters
sum: jouw totaal resultaat
element: elk element van de array
beginwaarde (0)
De callback wordt uitgevoerd op elk element. De eerste keer dat deze functie wordt opgeroepen wordt de eerste parameter (hier: sum) vervangen door de beginwaarde (hier: 0). Het resultaat van de functie wordt meegegeven als nieuwe beginwaarde voor het volgende element. In dit voorbeeld worden volgende calls uitgevoerd:
We kunnen dit ook gebruiken om bv. strings aan mekaar te hangen. Dit voorbeeld maakt van een array 1 string.
De beginwaarde hier is ''
.
Het resultaat hoeft geen primitive te zijn. We kunnen ook een object teruggeven:
Let op: de beginwaarde hier is ook een object.
Last updated