TypeScript: Arrays advanced
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 adhv 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.
Map
Soms willen we een bewerking doen op de elementen van een array. Door te loopen 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 kopieren.
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.
Filter
We kunnen ook een nieuwe array maken met een subset van 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. Het verschil met map is dat de return waarde van de callback een boolean moet 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:
Chains
We kunnen de return waarden van map en filter 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 verwachtt 2 parameters:
een functie met twee parameters
sum: jouw totaal resultaat
element: elk element van de array
beginwaarde
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:
(0, 1) => 0 + 1
(1, 2) => 1+ 2
(3, 3) => 3 + 3
(6, 4) => 6+ 4
resultsum = 10
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.
Sort
Arrays hebben ook een functie om te sorteren:
Alle functies die we tot nu toe hebben gezien op arrays geven een array terug. Ze passen de array zelf niet aan. Sort doet dat wel. Sort past de array zelf 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 adhv deze functie: a en b zullen dus door alle waarden van de array gaan.
De regels voor de callback functie zijn als volgt:
neem variabel 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:
Last updated