Array functies
Bij de introductie van ES6 werden er ook een boel extra array functies toegevoegd. Deze maken het werken met arrays nog interessanter. Hieronder zien we een paar veel voorkomende functies:
loops — MDN: Array.prototype.forEach
const numbers = [1,2,3,4];
for(let i=0; i < numbers.length; i++){
console.log(numbers[i]);
}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:
const numbers = [1,2,3,4];
numbers.forEach(e => console.log(e));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 — MDN: Array.prototype.sort
We kunnen de numbers in een array sorteren:
const numbers = [3,1,4,2];
numbers.sort();
// numbers = [1,2,3,4]Sort past dus de inhoud van een array zelf aan! Wanneer we de originele array niet willen aanpassen, kunnen we gebruik maken van de toSorted functie.
We moeten wel opletten met de default sort functie te gebruiken. Javascript zet namelijk alle waarden om naar strings en vergelijkt die. Dat kan leiden tot onverwachte resultaten:
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 elkaar vergelijken a.d.h.v. deze functie: a en b zullen door alle waarden van de array gaan.
De regels voor de callback functie zijn als volgt:
sorteerfunctie moet een getal kleiner dan 0 teruggeven als
a < bsorteerfunctie moet een getal groter dan 0 teruggeven als
a > bsorteerfunctie moet 0 teruggeven als
a === b
Bovenstaand voorbeeld kunnen we ook verkorten als volgt:
Of nog korter (dit werkt omdat de uitkomst van a - b negatief, positief of nul is, wat precies is wat sort verwacht):
We kunnen string arrays alfabetisch sorteren. Standaard vergelijkt sort() strings op basis van hun Unicode-waarden. Dit geeft vaak niet het gewenste resultaat omdat hoofdletters (bv. 'Z') vóór kleine letters (bv. 'a') komen, en accenten (bv. 'é') helemaal achteraan de lijst belanden.
Om strings correct alfabetisch te sorteren volgens de taalregels, gebruiken we localeCompare.
Wat localeCompare teruggeeft:
Een negatieve waarde (< 0) wanneer de oproepende string vóór de vergelijking-string hoort.
Nul (=== 0) wanneer de strings als gelijk worden beschouwd volgens de gekozen opties.
Een positieve waarde (> 0) wanneer de oproepende string ná de vergelijking-string hoort.
We kunnen ook objecten sorteren:
Hierboven sorteren we op de naam property van elk object. localeCompare zorgt voor een correcte alfabetische volgorde.
Willen we de objecten oplopend op leeftijd sorteren? Dan passen we de callback aan:
filter — MDN: Array.prototype.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 — MDN: Array.prototype.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.
find — MDN: Array.prototype.find
Soms willen we in een array één specifiek element zoeken dat voldoet aan een bepaalde voorwaarde. We zouden dit kunnen doen met een for-lus of forEach:
In dit voorbeeld zoeken we het eerste getal dat groter is dan 10. Zodra we dat gevonden hebben, bewaren we het en stoppen we (in dit geval doen we dat via een check op firstBig === null).
Dit kan veel eenvoudiger met de find-functie:
De find-functie doorloopt de array en geeft het eerste element terug dat voldoet aan de opgegeven voorwaarde (de callback). Zodra een element gevonden is waarvoor de callback true teruggeeft, stopt de functie en geeft het dat element terug.
Als geen enkel element aan de voorwaarde voldoet, dan is het resultaat undefined.
Voorbeeld:
chains
We kunnen de return waarden van array functies ook aan elkaar doorgeven. Dit doen we door "chains". Bv. wanneer we 2 maps na elkaar 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 — MDN: Array.prototype.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