- Leren
- Informatica & ICT
- Programmeren
- JavaScript programmeren: DOM, events, asynchrone code en modules
- Lussen en arrays in JavaScript
Lussen en arrays in JavaScript
for-, while- en do...while-lussen die het juiste aantal keren worden uitgevoerd, sla waarden op in arrays en voeg elementen toe, verwijder ze, zoek ze op en wijzig ze. Verwerk lijsten met for...of en met arraymethoden zoals map, filter, find en reduce, sorteer getallen en tekst in de volgorde die lezers verwachten en kopieer en combineer arrays met spreadsyntaxis zonder de oorspronkelijke arrays per ongeluk te wijzigen.BeginnerLes 2 van 9 in Cursus JavaScript programmeren: DOM, events, asynchrone code en modules
Wat je leert
- Schrijf
for-,while- endo...while-lussen die het juiste aantal keren worden uitgevoerd, volg ze stap voor stap en stuur ze metbreakencontinue.- Tel en herhaal met een for-lusSchrijf een
for-lus met de drie onderdelen, volg de teller van de eerste tot en met de laatste iteratie en bouw een lopend totaal op. - Herhaal zolang aan een voorwaarde is voldaanGebruik
while- endo...while-lussen als het aantal herhalingen niet van tevoren bekend is en zorg dat elke lus kan eindigen. - Beëindig lussen, sla iteraties over en nest lussenVerlaat een lus voortijdig met
break, sla een iteratie over metcontinueen plaats een lus binnen een andere om roosters en paren te doorlopen.
- Tel en herhaal met een for-lus
- Maak arrays, lees en wijzig hun elementen via een index, voeg items toe en verwijder ze, en doorzoek arrays of converteer tussen arrays en tekst.
- Maak een array en lees de elementenSchrijf arrayliterals, lees elementen via hun index vanaf nul en gebruik
lengthenat()om het laatste element te bereiken. - Voeg elementen toe, verwijder ze en vervang zeWijzig arrays binnen de bestaande array met toewijzing via een index,
push,pop,shift,unshiftensplice, kopieer delen metsliceen onderscheid methoden die een array wijzigen van methoden die een nieuwe array teruggeven. - Doorzoek een array en converteer tussen arrays en tekstControleer of een array een waarde bevat, zoek de positie van een waarde, vergelijk arrays correct en zet strings om in arrays en terug met
splitenjoin.
- Maak een array en lees de elementen
- Bezoek elk element van een array met
for- enfor...of-lussen en gebruik standaardluspatronen om totalen te berekenen, te tellen, te zoeken en resultaten op te bouwen.- Doorloop een array met for en for...ofKies tussen een
for-lus met index enfor...of, haal de index op wanneer je die nodig hebt en vermijdfor...inen het wijzigen van de arraylengte terwijl je de array doorloopt. - Bereken totalen, tel, zoek en bouw resultaten op met luspatronenPas de patronen voor een accumulator, teller, maximum, zoekactie en nieuwe array toe op echte gegevenslijsten en volg ze stap voor stap.
- Doorloop een array met for en for...of
- Geef korte pijlfuncties door aan arraymethoden en gebruik
forEach,map,filter,find,some,everyenreduceom gegevens te transformeren, selecteren, doorzoeken en samen te vatten.- Geef een functie door aan een arraymethodeSchrijf korte pijlfuncties, weet wat een callback ontvangt en moet teruggeven en gebruik
forEachom code voor elk element uit te voeren. - Transformeer en selecteer elementen met map en filterGebruik
mapom elk element in een nieuwe waarde om te zetten enfilterom de elementen te behouden die aan een voorwaarde voldoen, en schakel de twee aaneen. - Zoek elementen en toets voorwaardenGebruik
find,findIndex,findLast,findLastIndex,someeneveryom één element te vinden of een voorwaarde voor een lijst te controleren. - Combineer alle elementen tot één waarde met reduceGebruik
reducemet een accumulator en een beginwaarde om totalen, aantallen en uiterste waarden te berekenen en volg elke stap.
- Geef een functie door aan een arraymethode
- Sorteer getallen en tekst in de juiste volgorde, waaronder de alfabetische volgorde van de taal van de lezer, en kopieer en combineer arrays met spreadsyntaxis zonder de oorspronkelijke arrays per ongeluk te wijzigen.
- Sorteer arrays met getallen en strings en keer de volgorde omGebruik
sortmet een vergelijkingsfunctie, weet datsortde array wijzigt en gebruiktoSortedentoReversedom gesorteerde kopieën of kopieën in omgekeerde volgorde te krijgen. - Sorteer tekst en geef die weer volgens de taal van je lezersVergelijk strings met
localeCompareenIntl.Collatorvoor een natuurlijke alfabetische volgorde, bewaar datums in een sorteerbare vorm en zet arrays om in leesbare tekst metjoin,Intl.ListFormaten getalopmaak. - Kopieer en combineer arrays met spreadsyntaxisBegrijp dat arrayvariabelen naar een gedeelde array verwijzen en gebruik spreadsyntaxis om arrays te kopiëren, samen te voegen en in te voegen en om arrayelementen als afzonderlijke waarden aan een functie door te geven.
- Sorteer arrays met getallen en strings en keer de volgorde om
Lussen en arrays in JavaScript: uitleg
1Herhaal code met lussen
Voor het herhalen van code zijn een duidelijk beginpunt, een controle en een manier om voortgang te maken nodig. Tellussen maken het aantal stappen zichtbaar; bij voorwaardelijke lussen bepalen de gegevens wanneer de lus stopt. Volg elke veranderende variabele om te zien wat er vóór en na een controle wordt uitgevoerd. Gebruik daarna voortijdig stoppen en geneste lussen voor zoekacties, overgeslagen waarden en paren. Kleine veranderingen in een eindpunt of bijwerking kunnen het hele resultaat veranderen.
1.1 Stuur een tellus
Een lus herhaalt een codeblok. Elke uitvoering van het lichaam is een iteratie. Je kunt het aantal herhalingen veranderen door de teller en voorwaarde van de lus te wijzigen, zonder het lichaam te kopiëren.
Lees de drie onderdelen
for (let i = 1; i <= 5; i++) {
console.log(i);
}
Tussen de ronde haakjes staan een initialisatie, een voorwaarde en een bijwerking, gescheiden door puntkomma's. let i = 1 wordt eenmaal uitgevoerd. Daarna controleert JavaScript i <= 5. Als dat waar is, drukt het lichaam i af, telt de bijwerking i++ er 1 bij op en controleert JavaScript de voorwaarde opnieuw. Een onware voorwaarde beëindigt de lus voordat het lichaam nogmaals wordt uitgevoerd.
| Waarde vóór de controle | Voorwaarde | Actie |
|---|---|---|
1 | true | Druk 1 af; werk bij naar 2 |
2, 3, 4 | Steeds true | Druk elke waarde af en werk bij |
5 | true | Druk 5 af; werk bij naar 6 |
6 | false | Stop |
Er zijn vijf iteraties maar zes controles van de voorwaarde. Bij de laatste controle is de voorwaarde onwaar en wordt het lichaam niet uitgevoerd. Een lus waarvan de voorwaarde aan het begin onwaar is, heeft geen iteraties.
Kies de eindpunten en stapgrootte
for (let i = 0; i < 10; i++) bezoekt 0 tot en met 9. Beginnen bij 1 met i <= 10 bezoekt 1 tot en met 10. Beide worden tien keer uitgevoerd. Bij een stap van 1 van a naar b, als b minstens a is, geeft < b b - a iteraties en <= b b - a + 1.
De bijwerking kan grotere stappen nemen: for (let i = 0; i <= 20; i += 5) bezoekt 0, 5, 10, 15, 20. Achteruit tellen vereist zowel een afnemende bijwerking als een passende voorwaarde: for (let i = 3; i >= 1; i--) bezoekt 3, 2, 1. Schrijf de eerste en laatste gewenste waarde op voordat je < of <= kiest; zo herken je een grensfout van één positie.
Houd een lopend totaal bij
let total = 0;
for (let i = 1; i <= 100; i++) {
total += i;
}
console.log(total); // 5050
total is een accumulator: die neemt het resultaat van de ene iteratie mee naar de volgende. Na de eerste drie iteraties bevat die achtereenvolgens 1, 3 en 6. Zet de declaratie vóór de lus, zodat de accumulator eenmaal wordt geïnitialiseerd. Als je de accumulator binnen het lichaam declareert, wordt die telkens opnieuw ingesteld en is die na de lus niet beschikbaar.
Onderzoek een lus die zich vreemd gedraagt
De teller in de luskop gebruikt let omdat i++ er een nieuwe waarde aan toewijst. Een teller met const laat het lichaam eenmaal uitvoeren, maar geeft bij de bijwerking een TypeError. Een let i die in de luskop is gedeclareerd, hoort bij de lus; als je die daarna uitleest, krijg je een ReferenceError, tenzij er buiten de lus een andere variabele met de naam i bestaat.
Een puntkomma direct na de luskop geeft de lus een leeg lichaam. In for (let i = 0; i < 3; i++); { console.log("Hello"); } wordt het blok eenmaal na de lus uitgevoerd. Laat de openingsaccolade aansluiten op de luskop. Controleer ten slotte de richting van de bijwerking: beginnen bij 0 met i < 5 en i-- beweegt van het stoppunt af en eindigt nooit.
Belangrijkste punten
- De initialisatie wordt eenmaal uitgevoerd; de voorwaarde vóór elke iteratie; de bijwerking volgt op het lichaam.
- Controleer de eerste en laatste tellerwaarde om een grensfout van één positie te herkennen.
- Declareer een lopend totaal vóór de lus, zodat eerder werk behouden blijft.
- Gebruik
letvoor een teller die verandert en laat die naar het stoppunt toe bewegen.
1.2 Herhaal totdat een voorwaarde verandert
Sommige taken eindigen wanneer een resultaat een doel bereikt, niet na een bekend aantal stappen. Een while-lus controleert die stopvoorwaarde vóór elke herhaling. Een do...while-lus controleert die na het lichaam.
Controleer eerst met while
let balance = 1000;
let years = 0;
while (balance < 1500) {
balance = balance * 1.05;
years++;
}
console.log(years); // 9
Het saldo groeit met 5% per jaar. Beide variabelen worden vóór de lus geïnitialiseerd. Na acht herhalingen is het saldo ongeveer 1477.46, onder het doel, dus is nog een herhaling nodig. Na negen is het ongeveer 1551.33; de volgende controle is onwaar. Behoud tijdens de berekening het volledige saldo en rond alleen het weergegeven resultaat af.
Als een while-voorwaarde aanvankelijk onwaar is, wordt het lichaam nul keer uitgevoerd. Zet bij een eenvoudige tellus de initialisatie vóór while en de bijwerking aan het einde van het lichaam. Zo behoud je het gedrag van een for-lus als er geen continue is. Met continue vraagt de bijwerking extra aandacht omdat die kan worden overgeslagen.
Voer eenmaal uit vóór de controle
let n = 4096;
let digits = 0;
do {
n = Math.floor(n / 10);
digits++;
} while (n > 0);
console.log(digits); // 4
Math.floor rondt naar beneden af. Hier verwijdert elke deling het laatste cijfer: 4096 wordt 409, dan 40, 4 en 0. Elke verwijdering verhoogt digits. Als je met 0 begint, wordt het lichaam nog steeds eenmaal uitgevoerd en telt het correct één cijfer. Een while (n > 0) die vooraf controleert, zou dat geval overslaan en nul cijfers melden. Deze methode om cijfers te tellen is bedoeld voor niet-negatieve gehele getallen.
| Lus | Wanneer de voorwaarde wordt gecontroleerd | Minimumaantal uitvoeringen van het lichaam |
|---|---|---|
while | Vóór het lichaam | Nul |
do...while | Na het lichaam | Eén |
Met let n = 10 wordt een do...while-lichaam dat n afdrukt eenmaal uitgevoerd, ook als de voorwaarde n < 5 is. Een lus die dezelfde voorwaarde vooraf controleert, drukt niets af. De puntkomma hoort na de laatste voorwaarde in do...while.
Werk naar een uitgang toe
Een oneindige lus blijft zich herhalen zonder te eindigen. Als je n++ vergeet in let n = 0; while (n < 3) { console.log(n); }, blijft de voorwaarde altijd waar. Langlopende code kan een browsertabblad laten vastlopen. Volg wat de voorwaarde verandert en stop een vastgelopen script met de bedieningselementen van de browser.
Een samengestelde voorwaarde zoals attempts < 3 && !found gaat alleen door zolang beide controles waar zijn. De lus stopt wanneer drie pogingen zijn gebruikt of een resultaat is gevonden. Voor een niet-negatief geheel getal dat afneemt naar nul, maakt while (count > 0) het aftellen duidelijker dan while (count). Negatieve getallen zijn ook truthy, dus betekent een truthy-waarde op zichzelf niet dat een teller positief is.
Vermijd gelijkheid als stopcontrole voor decimale getallen. Tien optellingen van 0.1 geven 0.9999999999999999 in JavaScript, dus kan while (x !== 1) eindeloos voorbij het bedoelde eindpunt gaan. Een vergelijking zoals x < 1 staat toe dat de grens wordt overschreden; een teller met gehele getallen is beter wanneer precies tien stappen nodig zijn. Bereken elke decimale waarde uit die teller.
Belangrijkste punten
whilekan nul keer worden uitgevoerd;do...whilewordt altijd minstens eenmaal uitgevoerd.- Kies een voorwaarde op basis van wat nog moet gebeuren en wijzig vervolgens de invoer ervan in het lichaam.
- Een samengestelde voorwaarde kan het werk stoppen wanneer een limiet is bereikt of een resultaat is gevonden.
- Door afronding bij drijvendekommagetallen is exacte decimale gelijkheid een slechte stopcontrole.
- Gebruik tellers met gehele getallen als het aantal herhalingen exact moet zijn.
1.3 Stop een zoekactie, sla werk over en bezoek paren
Een lus kan stoppen voordat de voorwaarde onwaar wordt of werk voor slechts één item overslaan. Met geneste lussen kun je een reeks binnen een andere herhalen, bijvoorbeeld bij het bezoeken van rijen en kolommen.
Break of continue
break verlaat de bijbehorende lus onmiddellijk. Om het eerste veelvoud van 7 boven 50 te vinden:
for (let n = 51; n <= 100; n++) {
if (n % 7 === 0) {
console.log(n); // 56
break;
}
}
Na het afdrukken van 56 gaat de uitvoering na de lus verder. De waarden 57 tot en met 100 worden nooit gecontroleerd. while (true) kan hetzelfde patroon gebruiken wanneer de uitgang het gemakkelijkst binnen het lichaam te controleren is; een bereikbare break moet de uitgang bieden.
continue slaat de rest van de huidige iteratie over. In een for-lus wordt de bijwerking in de luskop nog wel uitgevoerd voordat de voorwaarde opnieuw wordt gecontroleerd:
for (let i = 1; i <= 9; i++) {
if (i % 2 === 0) continue;
console.log(i);
}
Bij de even waarden wordt het afdrukken overgeslagen, dus is de uitvoer 1, 3, 5, 7, 9. Als je continue door break vervangt, eindigt de lus bij 2 en wordt alleen 1 afgedrukt.
In een while-lus springt continue direct naar de voorwaarde. Een bijwerking die later in het lichaam staat, wordt overgeslagen. Als i gelijk is aan 2 en het lichaam begint met if (i === 2) continue;, kan de lus voor altijd op die waarde blijven steken. Zet de benodigde bijwerking vóór die sprong of gebruik for om te tellen.
Herhaal een binnenste lus voor elke rij
for (let row = 1; row <= 3; row++) {
let line = "";
for (let col = 1; col <= 4; col++) {
line = line + (row * col) + " ";
}
console.log(line.trim());
}
Voor row = 1 bezoekt de binnenste lus kolommen 1 tot en met 4 en bouwt de tekst “1 2 3 4” op. Voor rij 2 begint de lus opnieuw bij kolom 1 en produceert “2 4 6 8”. Rij 3 produceert “3 6 9 12”. Het binnenste lichaam wordt twaalf keer uitgevoerd: vier kolommen voor elk van de drie rijen. Declareer line binnen het buitenste lichaam, zodat elke rij met een lege string begint.
Gebruik verschillende namen voor de tellers. Een binnenste let i overschaduwt een buitenste i, waardoor het lastig wordt beide posities uit te lezen.
Bezoek elk verschillend paar eenmaal
Begin voor vier personen met de nummers 0 tot en met 3 de binnenste teller bij i + 1:
for (let i = 0; i < 4; i++) {
for (let j = i + 1; j < 4; j++) {
console.log(i, j);
}
}
De paren zijn 0–1, 0–2, 0–3, 1–2, 1–3, 2–3: zes bezoeken. Als j bij 0 begint, zijn er zestien bezoeken, waaronder paren van een persoon met zichzelf en omgekeerde herhalingen.
Een gewone break verlaat alleen de binnenste lus. Om een volledige geneste zoekactie te beëindigen, geef je de buitenste lus een label, bijvoorbeeld outer: for (...), en gebruik je bij de overeenkomst break outer;. Het label noemt de lus die moet worden verlaten; het verandert niet de volgorde waarin de paren worden gecontroleerd.
Belangrijkste punten
breakbeëindigt een lus;continueslaat de rest van één iteratie over.continuelaat een bijwerking van eenfor-lus uitvoeren, maar kan een bijwerking binnen eenwhile-lichaam overslaan.- De binnenste lus begint opnieuw voor elke iteratie van de buitenste lus.
- Gebruik
j = i + 1om elk verschillend paar eenmaal te bezoeken. - Een gewone
breakverlaat de binnenste lus. - Een
breakmet een label kan ook een buitenste lus verlaten.
2Sla gegevenslijsten op in arrays en wijzig ze
Een lijst heeft zowel waarden als posities. Arrays houden die waarden bij elkaar en geven elke waarde een genummerde index. Het lezen, vervangen, invoegen en verwijderen van elementen hangt allemaal af van die posities, en door wijzigingen kunnen latere elementen nieuwe indexen krijgen. Leer zowel wat elke methode teruggeeft als wat die wijzigt en kies daarna zoekacties en tekstconversies die de resultaatvorm opleveren die de volgende stap nodig heeft.
2.1 Lees waarden en posities in een array
Een array slaat een geordende lijst op onder één naam. De waarden heten elementen. Een arrayliteral gebruikt blokhaken en komma's: const temps = [18, 21, 19, 24];. De literal [] maakt een lege array.
Tel posities vanaf nul
const colors = ["red", "green", "blue"];
console.log(colors[0]); // "red"
console.log(colors[2]); // "blue"
console.log(colors.length); // 3
De index van een element is de positie geteld vanaf nul. Het derde element heeft index 2. length telt geïndexeerde posities, inclusief eventuele lege posities. Voor deze array zonder gaten is het ook het aantal elementen. De laatste index is colors.length - 1, dus colors[colors.length - 1] leest “blue”.
Als je colors[colors.length] uitleest, vraag je om index 3, één positie voorbij het einde, en krijg je undefined. Een ontbrekende index geeft niet alleen omdat die ontbreekt een fout. Ook colors[5] geeft undefined.
Lees vanaf het einde
colors.at(-1) leest het laatste element en colors.at(-2) het element daarvoor. Niet-negatieve indexen werken zoals gewoonlijk: colors.at(0) leest “red”. Een negatief getal tussen blokhaken heeft een andere betekenis: colors[-1] telt niet vanaf het einde en geeft voor deze array undefined.
| Expressie | Resultaat |
|---|---|
colors[1] | "green" |
colors.at(-1) | "blue" |
colors[3] | undefined |
colors[-1] | undefined |
Lees een lijst binnen een lijst
Een element kan zelf een array zijn:
const grid = [[1, 2, 3], [4, 5, 6]];
console.log(grid[1]); // [4, 5, 6]
console.log(grid[1][0]); // 4
De eerste index selecteert een rij. De tweede selecteert een waarde binnen die rij. grid.length is 2, terwijl grid[0].length gelijk is aan 3. Deze lengtes beschrijven verschillende arrays. Rijen in een geneste array kunnen verschillende lengtes hebben.
Arrays kunnen typen mengen, zoals in [42, "km", true]. Een lijst met één soort gegevens, zoals temperaturen, is gemakkelijker te verwerken omdat je elk element op dezelfde manier kunt behandelen.
Herken een array en voorkom verrassingen met lege posities
typeof [1, 2] geeft “object” terug en is dus geen specifieke controle op arrays. Gebruik Array.isArray(value): dat geeft true terug voor [1, 2] en false voor “12”.
new Array(3) maakt drie lege posities; het slaat niet het enkele getal 3 op. Gebruik [3] voor één element of [0, 0, 0] voor drie expliciete nullen. Een lege positie levert bij uitlezen undefined op, maar is een gat, geen expliciet opgeslagen waarde. Met arrayliterals maak je de bedoelde inhoud duidelijk.
Lees strings zonder ze ter plaatse te proberen te wijzigen
Strings ondersteunen ook indexering, length en at(). "hello"[1] is “e” en "hello".at(-1) is “o”. Strings zijn onveranderlijk: een toewijzing aan een tekenpositie vervangt het teken niet. In de strikte modus, waaronder JavaScript-modules, geeft die toewijzing een TypeError. Bouw een nieuwe string als tekst moet veranderen.
Belangrijkste punten
- Indexen beginnen bij
0; de laatste index islength - 1. at(-1)leest het laatste element;arr[-1]niet.- Lees geneste arrays één index tegelijk.
- Gebruik
Array.isArrayom arrays te herkennen. - Arrayliterals maken onderscheid tussen opgeslagen waarden en lege posities.
2.2 Wijzig een array of kopieer een deel ervan
Het wijzigen van een bestaande array heet mutatie. Sommige methoden wijzigen de array; andere geven een nieuwe array terug. De retourwaarde van een methode kan ook een lengte of een verwijderd element zijn, dus controleer zowel de array als het resultaat van de aanroep.
Vervang elementen en wijzig de uiteinden
const scores = [70, 80, 90];
scores[1] = 85;
console.log(scores); // [70, 85, 90]
const zorgt dat scores naar dezelfde array blijft verwijzen. Het bevriest de inhoud van die array niet. De toewijzing scores = [] zou een TypeError geven, maar toewijzing via een index is toegestaan.
| Methode | Wijziging | Retourwaarde |
|---|---|---|
push(...items) | Voeg toe aan het einde | Nieuwe lengte |
pop() | Verwijder van het einde | Verwijderd element |
unshift(...items) | Voeg toe aan het begin | Nieuwe lengte |
shift() | Verwijder van het begin | Verwijderd element |
Voor const queue = ["Ana", "Ben"]; geeft queue.push("Cleo") de waarde 3 terug. De array wordt ["Ana", "Ben", "Cleo"]. Daarna geeft queue.pop() “Cleo” terug en blijven de eerste twee namen over. Als je het resultaat van een aanroep van push opslaat, sla je de lengte als getal op, niet de bijgewerkte array. pop en shift geven undefined terug bij een lege array. Toevoegen of verwijderen aan het begin verschuift ook de andere indexen, wat bij lange arrays meer werk kan kosten.
Voeg in en verwijder in het midden
splice(start, deleteCount, ...items) wijzigt de array en geeft een array met verwijderde elementen terug:
const days = ["Mon", "Tue", "Thu", "Fri"];
const removed = days.splice(2, 0, "Wed");
// days: ["Mon", "Tue", "Wed", "Thu", "Fri"]
// removed: []
const nextRemoved = days.splice(1, 2);
// days: ["Mon", "Thu", "Fri"]
// nextRemoved: ["Tue", "Wed"]
De eerste aanroep begint bij index 2, verwijdert nul items en voegt daar “Wed” in. De tweede begint bij index 1 en verwijdert twee items. Het tweede argument is een aantal, geen eindindex. Elementen na een invoeging of verwijdering krijgen nieuwe indexen.
Kopieer een bereik met slice
slice(start, end) geeft een nieuwe array terug en sluit de eindindex uit. Voor const t = [10, 20, 30, 40, 50]; geeft t.slice(1, 3) de waarde [20, 30] en laat t ongewijzigd. t.slice(-2) kopieert de laatste twee elementen, [40, 50]. Zonder argumenten kopieert t.slice() de hele array. De extra letter in splice duidt op een andere bewerking: die wijzigt de oorspronkelijke array; slice kopieert een bereik.
Houd de lijst vrij van onbedoelde gaten
Als je voorbij het einde schrijft, ontstaan lege posities. Na const a = [1, 2]; a[4] = 5; is de lengte 5 en zijn indexen 2 en 3 gaten. Ook delete a[i] laat een gat achter en behoudt de lengte. Gebruik push om aan het einde toe te voegen en splice(i, 1) om een element te verwijderen en het gat te sluiten.
Een kleinere length toewijzen verwijdert elementen van het einde. a.length = 0 maakt de array leeg. De verwijderde elementen verschijnen niet opnieuw als de lengte later wordt vergroot.
Ook sort en reverse wijzigen arrays. Kopieermethoden zijn onder andere slice, concat, map, filter, toSorted, toReversed, toSpliced en with. Wanneer een methode een nieuwe array teruggeeft, sla je dat resultaat op of gebruik je het; de oorspronkelijke array bevat nog steeds de eerdere inhoud.
Belangrijkste punten
constvoorkomt hertoewijzing van de variabele, maar staat mutatie van de array toe.pushenunshiftgeven lengtes terug;popenshiftgeven verwijderde elementen terug.splicewijzigt de bestaande array en geeft de verwijderde elementen terug.slicekopieert een bereik zonder de eindindex mee te nemen.deletelaat een gat achter;splice(i, 1)sluit het.- Een kleinere
lengthinstellen verwijdert elementen van het einde. - Bewaar het resultaat van een kopieermethode wanneer je de nieuwe array nodig hebt.
2.3 Zoek waarden en zet lijsten om in tekst
Een zoekactie kan een ja/nee-resultaat of de positie van een element nodig hebben. Tekstconversie heeft een ander doel: de vorm van gegevens veranderen zodat een lijst kan worden gelezen, opgeslagen of verwerkt.
Vraag of iets aanwezig is of waar het staat
includes(value) geeft een booleaanse waarde terug. ["tea", "coffee"].includes("tea") is true; als je de zoekopdracht verandert in “Tea”, krijg je false. Tekst vergelijken is hoofdlettergevoelig en typen zijn van belang: [5].includes("5") is false.
indexOf(value) geeft de eerste overeenkomende index terug, of -1 wanneer geen waarde overeenkomt. lastIndexOf zoekt vanaf het einde. In [3, 7, 3, 9] staat de eerste 3 op index 0 en de laatste op index 2. Zoeken naar 5 geeft -1 terug.
Schrijf geen if (arr.indexOf(x)). Index 0 is falsy, terwijl -1 truthy is: die controle wijst een overeenkomst aan het begin af en accepteert een ontbrekende waarde. Gebruik arr.indexOf(x) !== -1, of gebruik includes als de positie niet nodig is.
Voor gewone waarden vereisen beide methoden hetzelfde type en dezelfde waarde, net als strikte gelijkheid. Ze behandelen NaN verschillend: [1, NaN].includes(NaN) is true, maar [1, NaN].indexOf(NaN) is -1. De gelijkheidsregel van includes kan NaN aan zichzelf gelijkstellen.
Vergelijk inhoud bewust
Twee afzonderlijk gemaakte arrays zijn verschillende arrays, ook wanneer hun elementen overeenkomen. [1, 2] === [1, 2] is false; ook == vergelijkt array-identiteit. Om dezelfde geordende inhoud te controleren, vergelijk je de lengtes en daarna de waarden op elke overeenkomstige index. Alleen met een ja/nee-controle op aanwezigheid stel je niet vast dat de volgorde en het aantal herhalingen gelijk zijn.
Voeg elementen samen tot een string
const dateParts = ["2026", "03", "15"];
console.log(dateParts.join("-")); // "2026-03-15"
console.log([1, 2, 3].join()); // "1,2,3"
console.log([1, 2, 3].join("")); // "123"
join plaatst het scheidingsteken tussen de elementen, nooit na het laatste. Het standaardscheidingsteken is een komma zonder spaties. Elementen met null en undefined leveren lege tekst op. Kies het scheidingsteken expliciet voor leesbare uitvoer.
Als je + met een string gebruikt, wordt een array ook omgezet in tekst, maar met komma's: "List: " + [1, 2] wordt “List: 1,2”. Geneste structuur gaat in die tekst verloren: String([1, [2, 3]]) geeft “1,2,3”. Log de array zelf om de structuur te bekijken.
Splits tekst in delen
"red,green,blue".split(",") geeft ["red", "green", "blue"] terug. Het scheidingsteken moet exact overeenkomen. Als je “red, green” alleen op een komma splitst, blijft de spatie aan het begin van “ green” staan; als je op “, ” splitst, worden de komma en die spatie verwijderd.
"4,8,15".split(",") geeft strings terug, geen getallen. Converteer elk deel voordat je getalswaarden optelt. Anders kan de operator + tekst samenvoegen in plaats van een totaal te berekenen.
Voor eenvoudige tekst op basis van letters produceert "stressed".split("").reverse().join("") “desserts”. De splitsing maakt een nieuwe array, het omkeren wijzigt die array en het samenvoegen bouwt opnieuw een string op. Een leeg scheidingsteken splitst UTF-16-code-eenheden; sommige symbolen gebruiken meer dan één eenheid, dus is dit geen algemene manier om alle leesbare tekst om te keren.
Belangrijkste punten
- Gebruik
includesvoor aanwezigheid enindexOfoflastIndexOfvoor posities. - Vergelijk een zoekindex met
-1; gebruik de truthy-waarde niet. - Afzonderlijke arrays worden op identiteit vergeleken, ook als hun waarden er identiek uitzien.
joinmaakt tekst;splitmaakt een array van strings.- Spaties horen alleen bij het scheidingsteken als je ze expliciet toevoegt.
- Converteer numerieke tekst voordat je ermee rekent.
3Doorloop arrays met lussen
Een lijst doorlopen is gemakkelijker als de lus de juiste informatie beschikbaar maakt. Soms heeft het lichaam alleen elke waarde nodig; soms heeft het een index, een vorige waarde of een achterwaartse route door de array nodig. Bouw herbruikbare patronen voor totalen, aantallen, zoekacties en nieuwe lijsten en bekijk hoe elk resultaat na een iteratie verandert. Deze patronen verklaren ook de arraymethoden die volgen.
3.1 Bezoek arraywaarden zonder ze over te slaan
Een lus kan arrayposities bezoeken of de waarden rechtstreeks nemen. Kies de vorm die de informatie beschikbaar maakt die het lichaam nodig heeft. Houd rekening met veranderende indexen van de array wanneer je elementen invoegt of verwijdert.
Gebruik indexen voor posities en richting
const fruits = ["apple", "pear", "plum"];
for (let i = 0; i < fruits.length; i++) {
console.log(fruits[i]);
}
De indexen zijn 0, 1, 2. De controle is < fruits.length, omdat index 3 voorbij het einde ligt. Met <= zou een extra iteratie undefined uitlezen. Lussen met index kunnen ook achteruit lopen, beginnend bij fruits.length - 1 en doorgaand zolang i >= 0, of elk tweede element bezoeken met i += 2.
Gebruik for...of voor waarden
for (const fruit of fruits) {
console.log(fruit.toUpperCase());
}
Dit drukt “APPLE”, “PEAR” en “PLUM” af. fruit bevat één waarde per iteratie. const werkt omdat elke iteratie een nieuwe binding maakt; de lus wijst geen nieuwe waarde toe aan één gedeelde teller. for...of werkt ook op strings. Een lus over “banana” kan klinkers tellen door voor elke ch "aeiou".includes(ch) te controleren.
Een lokaal getal wijzigen schrijft niet naar de array. Na for (let n of nums) { n = n * 2; } zijn de numerieke elementen van nums ongewijzigd. Om ze te wijzigen, wijs je waarden toe via nums[i] of bouw je een nieuwe array met verdubbelde getallen.
Haal waarden en indexen samen op
entries() levert paren met een index en een waarde. Blokhaken in de luskop pakken elk paar uit:
for (const [i, fruit] of fruits.entries()) {
console.log((i + 1) + ". " + fruit);
}
De uitvoer is “1. apple”, “2. pear”, “3. plum”. Arrayindexen beginnen nog steeds bij nul; i + 1 verandert alleen de weergegeven nummering.
| Nodig | Handige lus |
|---|---|
| Elke waarde op volgorde | for...of |
| Posities, omgekeerde volgorde of aangrenzende elementen | for met index |
| Waarde en index samen | for...of over entries() |
for...in bezoekt eigenschapsnamen. Bij arrays zijn de indexen strings en kan de lus extra eigenschappen bevatten. Gebruik de bovenstaande vormen om arrayelementen te verwerken.
Voorkom dat verschoven elementen worden overgeslagen
const nums = [2, 4, 5, 6];
for (let i = 0; i < nums.length; i++) {
if (nums[i] % 2 === 0) nums.splice(i, 1);
}
// nums is [4, 5]
Op index 0 schuift door het verwijderen van 2 de waarde 4 naar index 0. De bijwerking verplaatst i naar 1, dus wordt 4 overgeslagen. De lus ziet daarna 5 en verwijdert 6. Het resultaat bevat nog steeds een even getal.
Als je op index verwijdert, loop dan vanaf het einde achteruit. Door een element te verwijderen verschuiven dan alleen posities die al zijn bezocht. Een andere aanpak is een nieuwe array bouwen met de waarden die je wilt behouden. Voeg geen elementen toe aan dezelfde array terwijl de stopcontrole van de lus van de lengte afhangt; het eindpunt kan blijven opschuiven.
Belangrijkste punten
- Bezoek indexen vanaf
0zolangi < arr.length. - Gebruik
for...ofals alleen waarden nodig zijn. entries()levert index-waardeparen.- Een lokale numerieke lusvariabele een nieuwe waarde geven vervangt geen arrayelement.
- Bij vooruit verwijderen kun je verschoven elementen overslaan; loop achteruit of bouw een nieuwe array.
3.2 Bouw totalen, zoekacties en nieuwe lijsten op
Veel taken met arrays gebruiken dezelfde kleine luspatronen. Bepaal welk resultaat je nodig hebt, kies de beginwaarde en werk het resultaat eenmaal bij voor elk relevant element. Door de uitvoering te volgen, zie je wat het resultaat na elke stap betekent.
Tel waarden op en tel overeenkomsten
const temps = [18, 21, 19, 24];
let sum = 0;
let warm = 0;
for (const t of temps) {
sum += t;
if (t > 20) warm++;
}
sum telt elke temperatuur op; warm telt er alleen één bij op voor een temperatuur boven 20 °C. Ze houden verschillende grootheden bij. Dat onderscheid wordt zichtbaar als je de uitvoering volgt:
t | sum na optellen | warm na controle |
|---|---|---|
18 | 18 | 0 |
21 | 39 | 1 |
19 | 58 | 1 |
24 | 82 | 2 |
Het gemiddelde is sum / temps.length, wat 20,5 °C geeft. Controleer de lengte voordat je deelt: een lege array geeft 0 / 0, wat NaN is en geen betekenisvol gemiddelde.
Houd een grootste of kleinste waarde bij
Initialiseer bij een niet-lege array het maximum met het eerste element. Vervang het daarna alleen wanneer je een grotere waarde vindt:
const values = [-3, -7, -1, -5];
let max = values[0];
for (const n of values) {
if (n > max) max = n;
}
// max is -1
Als je bij nul begint, blijft bij een lijst met alleen negatieve waarden ten onrechte nul staan. Beginnen bij -Infinity werkt ook voor een maximum, maar bij een lege invoer blijft dan die beginwaarde staan. Voor een minimum keer je de vergelijking om en kies je het eerste element of Infinity als beginwaarde.
Zoek een eerste overeenkomst of controleer een hele lijst
Een zoekactie slaat een overeenkomst op en verlaat de lus met break. Met let firstWarm; kan de lus bij de eerste t > 20 de toewijzing firstWarm = t uitvoeren en stoppen. De lus vindt 21 en controleert de latere elementen niet. Als niets overeenkomt, blijft de variabele undefined.
Voor een controle of “alle” elementen voldoen, begin je een vlag met true en stel je die bij de eerste mislukte controle in op false. Voor een controle of “minstens één” element voldoet, begin je met false en stel je de vlag bij de eerste geslaagde controle in op true. Als een score vanaf 50 voldoende is, slaagt [72, 85, 49] bij 49 niet voor de controle of alle scores voldoende zijn. Bij een lege lijst blijft de beginwaarde van de vlag ongewijzigd.
Bouw gewijzigde waarden op en vergelijk aangrenzende elementen
const km = [1.5, 3, 0.25];
const meters = [];
for (const d of km) {
meters.push(d * 1000);
}
// meters is [1500, 3000, 250]
De nieuwe array begint leeg en ontvangt per iteratie één omgerekende afstand. Zet een voorwaarde vóór push als slechts enkele waarden in het resultaat thuishoren.
Begin voor veranderingen van dag tot dag bij index 1, omdat index 0 geen vorige dag heeft:
const changes = [];
for (let i = 1; i < temps.length; i++) {
changes.push(temps[i] - temps[i - 1]);
}
// changes is [3, -2, 5]
Er is één verschil minder dan er metingen zijn. Als je in de omgekeerde volgorde aftrekt, keert elk teken om. Dezelfde resultaatvormen komen terug bij arraymethoden: map bouwt getransformeerde waarden op, filter behoudt overeenkomende elementen, find zoekt, some en every controleren en reduce verzamelt waarden. Een lus blijft nuttig wanneer je bij één keer doorlopen meerdere resultaten nodig hebt, zoals bij sum en warm.
Belangrijkste punten
- Begin totalen en aantallen bij nul en werk elk bij voor het eigen doel.
- Initialiseer een uiterste waarde met een waarde uit de gegevens of met een passende oneindige waarde.
- Een zoekactie naar de eerste overeenkomst stopt met
break. - Vlaggen voor controles op alle of minstens één element beginnen met tegengestelde booleaanse waarden.
- Bouw een nieuwe array met
pushom de oorspronkelijke array te behouden. - Begin vergelijkingen van aangrenzende elementen bij index
1. - Volg veranderende variabelen om te vinden waar een resultaat voor het eerst misgaat.
4Verwerk arrays met methoden die callbacks gebruiken
Met arraymethoden kun je een korte functie laten beschrijven wat er met elke waarde moet gebeuren. De methode regelt het doorlopen, terwijl de callback een transformatie, een controle of het volgende tussenresultaat levert. Lees de teruggegeven waarde zorgvuldig: die kan een array, een element, een index, een booleaanse waarde of een totaal zijn. Dezelfde paar regels voor callbacks ondersteunen al deze taken, ook voor betrouwbaar gedrag bij een lege lijst.
4.1 Geef een callback aan een arraymethode
Een functie ontvangt invoer, voert code uit en kan een resultaat teruggeven. Een callback is een functie die aan een andere functie wordt doorgegeven om te worden aangeroepen. Arraymethoden gebruiken callbacks om het werk voor elk element te beschrijven.
Schrijf een korte pijlfunctie
n => n * 2 ontvangt een parameter met de naam n en geeft de verdubbelde waarde terug. De pijl scheidt de invoer van het lichaam. Bij één parameter mogen de ronde haakjes worden weggelaten. Bij nul of meerdere parameters zijn ze nodig: () => 0 en (a, b) => a - b.
const double = n => n * 2;
const doubled = [1, 2, 3].map(double);
// doubled is [2, 4, 6]
double is de naam van de functie zelf. De methode roept die met elk getal aan. Als je map(double()) schrijft, roep je de functie direct aan en geef je het resultaat door in plaats van de functie. Gebruik bij een benoemde controle zoals function isEven(n) { return n % 2 === 0; } de aanroep filter(isEven) om de methode elk element te laten doorgeven.
Geef een waarde terug vanuit een instructieblok
Een expressie na de pijl wordt automatisch teruggegeven. Accolades maken een blok, dus heeft een resultaat een expliciete return nodig:
const double = n => {
const doubled = n * 2;
return doubled;
};
Zonder return geeft de functie undefined terug. [1, 2, 3].map(n => { n * 2; }) levert daarom [undefined, undefined, undefined] op. De vermenigvuldiging wordt uitgevoerd, maar de waarde wordt nooit het resultaat van de callback.
Lees callbackargumenten op basis van hun positie
Methoden zoals map, filter en forEach geven eerst het element door, als tweede de index vanaf nul en als derde de hele array. In (name, i) => ... kies je de namen zelf; hun posities bepalen wat ze ontvangen. Laat ongebruikte parameters aan het einde weg. Andere methoden hebben andere parameterlijsten: reduce ontvangt ook een accumulator en een sorteercallback ontvangt twee waarden om te vergelijken.
Gebruik forEach voor acties
const letters = ["a", "b"];
const result = letters.forEach((letter, i) => {
console.log(i + ": " + letter);
});
// Prints "0: a" and "1: b".
// result is undefined.
Afdrukken is een neveneffect: een actie die tijdens de uitvoering van de callback plaatsvindt. forEach gooit retourwaarden van callbacks weg en geeft zelf undefined terug. Gebruik map als je een nieuwe array met resultaten nodig hebt. Een waarde teruggeven vanuit een forEach-callback verandert die regel niet.
Een return in deze callback beëindigt alleen de huidige aanroep; de methode gaat verder met het volgende element. Je kunt break niet binnen een callback gebruiken om forEach te verlaten. Kies for...of met break, of een zoekmethode zoals find of some, wanneer later werk bij een overeenkomst moet stoppen.
Deze callbackmethoden wijzigen de bronarray niet zelf. De callback kan die nog wel muteren, bijvoorbeeld via een toewijzing met een index of push. Als callbacks zich richten op hun retourwaarde of bedoelde actie, is het gemakkelijker te beredeneren wat de bronarray daarna bevat.
Belangrijkste punten
- Geef de callbackfunctie zelf door, zonder die eerst aan te roepen.
- Een expressie als functielichaam geeft de waarde automatisch terug; een instructieblok als functielichaam heeft
returnnodig. - De posities van callbackparameters bepalen hun betekenis.
forEachvoert acties uit en geeftundefinedterug.
4.2 Transformeer elke waarde of behoud overeenkomende waarden
Kies een arraymethode op basis van de vorm van het resultaat. map levert een waarde voor elk aanwezig element. filter behoudt de oorspronkelijke elementen die aan een voorwaarde voldoen. Beide geven nieuwe arrays terug.
Transformeer met map
const km = [1.5, 3, 0.25];
const meters = km.map(d => d * 1000);
// meters is [1500, 3000, 250]; km is unchanged.
De retourwaarde van de callback wordt het element op de overeenkomstige positie. Bij invoer zonder gaten wordt de callback eenmaal per element aangeroepen en heeft het resultaat dezelfde lengte. Stringelementen transformeren werkt ook: ["ana", "ben"].map(s => s.toUpperCase()) geeft ["ANA", "BEN"].
De tweede callbackparameter geeft de index. ["Ana", "Ben"].map((name, i) => (i + 1) + ". " + name) bouwt ["1. Ana", "2. Ben"] op. Als de callback een instructieblok als lichaam heeft, geef je de op te slaan waarde expliciet terug.
Selecteer met filter
const temps = [18, 21, 19, 24];
const warm = temps.filter(t => t > 20);
// warm is [21, 24]
filter behoudt een element wanneer de callback een truthy-resultaat teruggeeft. De methode behoudt het element zelf, niet de booleaanse waarde van de callback. De behouden waarden blijven in hun oorspronkelijke volgorde. Het resultaat kan alle, enkele of geen elementen bevatten; temps.filter(t => t > 30) is [].
Geef niet het element zelf terug wanneer nul een geldige waarde is. [0, 5, 0, 3].filter(n => n) laat beide nullen weg omdat ze falsy zijn. Een voorwaarde zoals n !== null verwijdert ontbrekende metingen die door null worden voorgesteld, terwijl nul behouden blijft. Geef de werkelijke regel aan om een element te behouden.
| Benodigd resultaat | Methode |
|---|---|
| Eén getransformeerde waarde per element | map |
| Alle oorspronkelijke elementen die aan een voorwaarde voldoen | filter |
| Enkele elementen, daarna getransformeerd | filter gevolgd door map |
Als je map gebruikt met een voorwaardelijke expressie die undefined teruggeeft voor afgewezen elementen, worden die niet verwijderd. Die resultaten met undefined nemen nog steeds posities in de nieuwe array in.
Volg een keten van links naar rechts
[12, 7, 30, 4].filter(n => n >= 10).map(n => n / 2) maakt eerst [12, 30] en daarna [6, 15]. De tweede callback ontvangt alleen de behouden elementen. Eerst filteren is passend wanneer de controle naar de oorspronkelijke waarden verwijst. Als je de volgorde verandert, kan veranderen wat de controle te zien krijgt.
Converteer numerieke tekst bewust
const numbers = "4,8,15".split(",").map(Number);
// numbers is [4, 8, 15]
Number ontvangt elk tekstdeel en levert een getal op. parseInt rechtstreeks doorgeven is een valkuil: het tweede argument is een grondtal, terwijl map daar de index doorgeeft. ["10", "10", "10"].map(parseInt) geeft [10, NaN, 2]. Gebruik map(s => parseInt(s, 10)) om het grondtal vast te zetten, of map(Number) voor deze strings met gehele getallen.
Noch map noch filter vervangt de bronarray. Alleen temps.map(t => t + 1); schrijven gooit de nieuw berekende array weg. Sla die op, geef die terug vanuit een functie of gebruik die in een keten.
Belangrijkste punten
mapgeeft getransformeerde waarden terug in een nieuwe array van dezelfde lengte.filtergeeft overeenkomende oorspronkelijke elementen terug in hun bestaande volgorde.- Een filtercontrole moet de bedoelde regel uitdrukken, zodat geldige nullen behouden blijven.
- Aaneengeschakelde callbacks werken op het resultaat van de vorige methode.
- Gebruik
Numberof een omhullende functie met één argument in plaats vanmap(parseInt). - Sla de nieuwe array op of gebruik die; de bronarray blijft ongewijzigd.
4.3 Zoek één overeenkomst en controleer op één of alle elementen
Sommige vragen vereisen één waarde, andere een positie of een ja/nee-antwoord. Zoekmethoden kunnen stoppen zodra dat antwoord bekend is. Door het juiste retourtype te kiezen, kun je latere voorwaarden gemakkelijker correct schrijven.
Kies een waarde of een index
const temps = [18, 21, 19, 24];
console.log(temps.find(t => t > 20)); // 21
console.log(temps.findIndex(t => t > 20)); // 1
console.log(temps.findLast(t => t > 20)); // 24
console.log(temps.findLastIndex(t => t > 20)); // 3
find zoekt vanaf het begin en geeft het eerste overeenkomende element terug. findIndex geeft de index daarvan terug. De vormen met Last zoeken achteruit. Alle vier stoppen wanneer ze de gevraagde overeenkomst vinden.
| Methode | Resultaat bij overeenkomst | Resultaat zonder overeenkomst |
|---|---|---|
find, findLast | Element | undefined |
findIndex, findLastIndex | Index | -1 |
filter | Array met alle overeenkomsten | [] |
temps.find(t => t > 30) geeft undefined terug; temps.findIndex(t => t > 30) geeft -1 terug. Controleer i !== -1 voordat je een gevonden index aan splice doorgeeft. Anders verwijdert splice(-1, 1) het laatste element, ook al is er geen overeenkomst gevonden.
Behoud falsy-overeenkomsten
[3, 0, 5].find(n => n < 1) geeft 0 terug, een geslaagde overeenkomst. if (result) behandelt die ten onrechte als een mislukking omdat nul falsy is. Voor numerieke gegevens maakt result !== undefined onderscheid tussen nul en geen overeenkomst. Als een array zelf undefined als overeenkomende waarde kan bevatten, gebruik dan findIndex en vergelijk het resultaat met -1; de waarde alleen kan die gevallen niet onderscheiden.
filter is geschikt als alle overeenkomsten nodig zijn. [5, 12, 8, 130].filter(n => n > 10) geeft [12, 130]; find geeft alleen 12 terug. Als je filter(...)[0] gebruikt, wordt de volledige array met overeenkomsten berekend voordat de eerste waarde wordt gelezen.
Controleer op minstens één of alle elementen
const scores = [72, 85, 49];
const anyFailed = scores.some(s => s < 50); // true
const allPassed = scores.every(s => s >= 50); // false
some stopt bij de eerste geslaagde controle. every stopt bij de eerste mislukte controle. Hun antwoorden zijn booleaanse waarden, geen elementen. Bij deze aanroepen laat de 49 de controle met some slagen en die met every mislukken.
Voor een lege array geeft some false terug omdat niets voldoet. every geeft true terug omdat niets niet voldoet. Als een volledige verzameling resultaten minstens één score moet bevatten, combineer je de controles: scores.length > 0 && scores.every(s => s >= 50). De lengtevoorwaarde handelt leegte af; every controleert de elementen.
Kies exacte aanwezigheid of een eigen controle
includes("ana") zoekt precies die waarde. Een hoofdletterongevoelige zoekactie heeft een callback nodig: names.some(n => n.toLowerCase() === "ana"). Die kan zowel “Ana” als “ANA” accepteren. Gebruik includes voor een bekende waarde en een zoekactie met een callback wanneer elk element volgens een regel moet worden gecontroleerd.
Belangrijkste punten
- Kies een waarde, index, array of booleaanse waarde op basis van het resultaat dat je nodig hebt.
findLastenfindLastIndexzoeken vanaf het einde.- Vergelijk een index met
-1voordat je die gebruikt om een array te wijzigen. - Een falsy-element zoals
0kan een echte overeenkomst zijn. somestopt bij een geslaagde controle;everystopt bij een mislukte controle.- Lege arrays geven
falsevoorsomeentruevoorevery.
4.4 Neem één resultaat mee door reduce
reduce neemt een accumulator mee van het ene element naar het volgende. De callback geeft de accumulator voor de volgende stap terug. Na het laatste element geeft de methode die eindwaarde terug.
Volg een totaal
const temps = [18, 21, 19, 24];
const total = temps.reduce((sum, t) => sum + t, 0);
// total is 82
De 0 is de beginwaarde van de accumulator. De callback ontvangt eerst sum en als tweede de huidige temperatuur t. De teruggegeven som wordt het eerste argument van de volgende aanroep.
| Accumulator vooraf | Element | Teruggegeven accumulator |
|---|---|---|
0 | 18 | 18 |
18 | 21 | 39 |
39 | 19 | 58 |
58 | 24 | 82 |
Dit is hetzelfde lopende totaal als bij een lus met let sum = 0. Een callback heeft na de accumulator en het element ook optionele argumenten voor de index en de array. De parameternamen zijn vrij te kiezen, maar hun volgorde ligt vast.
Geef een bruikbare beginwaarde op
Met een beginwaarde begint de reductie bij het eerste element. Zonder beginwaarde wordt het eerste aanwezige element de accumulator en beginnen de callbackaanroepen bij het volgende aanwezige element. Bij een lege array geeft het weglaten van de beginwaarde een TypeError. [].reduce((sum, n) => sum + n, 0) geeft veilig 0 terug omdat geen callbackaanroep nodig is.
De beginwaarde bepaalt ook het soort resultaat. Gebruik 0 voor totalen of aantallen en "" voor tekst. ["a", "b", "c"].reduce((text, s) => text + s.toUpperCase(), "") bouwt “ABC” op. Een numeriek totaal dat met een string begint, kan door + per ongeluk tekst samenvoegen.
Tel en vind een uiterste waarde
const scores = [72, 85, 49];
const passed = scores.reduce(
(count, s) => s >= 50 ? count + 1 : count,
0
);
// passed is 2
Bij een voldoende komt er één bij; bij een onvoldoende wordt het ongewijzigde aantal teruggegeven. Elke tak levert een volgende accumulator. Geef voor een maximum de grotere waarde terug: [-3, -7, -1, -5].reduce((max, n) => n > max ? n : max, -Infinity) geeft -1. Beginnen bij nul zou verkeerd zijn voor deze lijst met alleen negatieve waarden. Lege invoer laat -Infinity staan, dus handel dat resultaat af wanneer een echt maximum nodig is.
Geef op elk pad een waarde terug
Een callback met een blok heeft return nodig. (sum, n) => { sum + n; } geeft undefined terug, dus is het eindresultaat van de reductie undefined. Een gedeeltelijk ontbrekende retourwaarde is ook gevaarlijk. Als je bij het tellen in [72, 49, 85] alleen bij een voldoende een waarde teruggeeft, krijg je eerst 1, daarna undefined bij 49 en daarna NaN wanneer bij 85 één wordt opgeteld. Geef de ongewijzigde accumulator terug wanneer een element niets bijdraagt.
Combineer bewerkingen zonder de taak te verhullen
Het totaal van de voldoende scores is scores.filter(s => s >= 50).reduce((sum, s) => sum + s, 0), wat 157 geeft. Voor een gemiddelde is een apart aantal nodig: temps.reduce((sum, t) => sum + t, 0) / temps.length geeft 20,5 °C. Controleer eerst de lengte, want lege invoer geeft na de deling NaN. Als een callback meerdere niet-gerelateerde taken gaat uitvoeren, kan een for...of-lus de veranderende resultaten duidelijker tonen.
Belangrijkste punten
reducegeeft eerst de accumulator en daarna het element door.- De callback moet op elk pad de volgende accumulator teruggeven.
- Een expliciete beginwaarde maakt het gedrag bij lege invoer voorspelbaar.
- Kies de beginwaarde op basis van het resultaat: totaal, aantal, tekst of uiterste waarde.
- Een gemiddelde heeft zowel een totaal als een aantal ongelijk aan nul nodig.
5Sorteer, kopieer en combineer arrays
Een lijst ordenen en een lijst kopiëren zijn afzonderlijke keuzes. Voor het sorteren van getallen zijn andere vergelijkingsregels nodig dan voor een lijst met namen, en de taal beïnvloedt de volgorde die lezers verwachten. Bepaal of de oorspronkelijke volgorde behouden moet blijven voordat je een wijzigings- of kopieermethode kiest. Referenties en oppervlakkige kopieën verklaren welke latere wijzigingen lokaal blijven en welke zichtbaar blijven via een andere arraynaam.
5.1 Sorteer getallen en behoud het origineel
Sorteren kiest een volgorde door elementen te vergelijken. Omkeren draait alleen de bestaande volgorde om. Beide bewerkingen hebben methoden die een array wijzigen en methoden die een kopie maken.
Begrijp de standaardvolgorde
[10, 9, 1, 100].sort() geeft [1, 10, 100, 9]. Zonder vergelijkingsfunctie vergelijkt sort elementen als strings, teken voor teken met UTF-16-code-eenheden. “100” begint met “1”, dat vóór “9” komt. De opgeslagen elementen blijven getallen; alleen de vergelijking gebruikt hun tekstvorm.
Ook voor strings kan deze standaardvolgorde lezers verrassen. ["banana", "Cherry", "apple"].sort() geeft ["Cherry", "apple", "banana"], omdat ASCII-hoofdletters vóór kleine letters komen. Letters met een accent kunnen worden gescheiden van de letters waarmee lezers ze groeperen. Gebruik een taalafhankelijke vergelijking voor de alfabetische volgorde die mensen verwachten.
Geef een waarde met het juiste teken terug
Een vergelijkingsfunctie ontvangt twee elementen, a en b. Een negatieve retourwaarde plaatst a vóór b; een positieve retourwaarde plaatst het na b; nul behandelt ze als gelijk bij het sorteren.
const nums = [10, 9, 1, 100];
nums.sort((a, b) => a - b);
// nums is [1, 9, 10, 100]
De vergelijking van 10 met 9 levert de positieve waarde 1 op, dus komt 9 vóór 10. Gebruik (a, b) => b - a voor aflopende getalvolgorde. Geef een getal met een betekenisvol teken terug. (a, b) => a > b geeft alleen true of false terug, die 1 of 0 worden; de functie meldt nooit dat a vóór b hoort. Zo'n vergelijkingsfunctie geeft een onbetrouwbare volgorde.
Sorteren is stabiel: elementen die als gelijk worden vergeleken, behouden hun oorspronkelijke onderlinge volgorde. ["kiwi", "fig", "pear", "plum"].sort((a, b) => a.length - b.length) geeft ["fig", "kiwi", "pear", "plum"]. De drie woorden van vier letters behouden hun volgorde.
Kies mutatie of een kopie
| Methode | Effect op de bronarray | Teruggegeven array |
|---|---|---|
sort(compare) | Sorteert binnen de bronarray | Dezelfde array |
toSorted(compare) | Laat de bronarray ongewijzigd | Nieuwe gesorteerde array |
reverse() | Keert de volgorde binnen de bronarray om | Dezelfde array |
toReversed() | Laat de bronarray ongewijzigd | Nieuwe array in omgekeerde volgorde |
const sorted = scores.sort((a, b) => a - b); geeft een tweede naam aan dezelfde, nu gesorteerde array. De eerdere volgorde blijft niet behouden. Gebruik voor een nieuwe gesorteerde array scores.toSorted((a, b) => a - b) of maak een kopie met spreadsyntaxis vóór sort.
[3, 1, 2].toReversed() geeft [2, 1, 3]. Dat is een omgekeerde reeks, geen aflopende getalvolgorde. Om de grootste waarden eerst te zetten, gebruik je een vergelijkingsfunctie voor aflopende volgorde of sorteer je oplopend voordat je de volgorde omkeert.
Controleer typen voordat je numerieke tekst sorteert
Waarden uit split zijn strings. ["10", "9", "100"].sort() geeft ["10", "100", "9"]. Aftrekken in een vergelijkingsfunctie converteert numerieke strings tijdens de vergelijking, maar laat de elementen als strings staan. Converteer eerst met map(Number) wanneer de waarden numerieke gegevens zijn en gebruik daarna een vergelijkingsfunctie voor getallen. Dit bereidt de gegevens ook voor op later optellen zonder onbedoelde tekstsamenvoeging.
Belangrijkste punten
- Standaardsortering vergelijkt tekst, ook bij numerieke elementen.
- Gebruik
a - bvoor oplopende enb - avoor aflopende getallen. - Een vergelijkingsfunctie geeft een negatief getal, nul of een positief getal terug.
- Elementen die als gelijk worden vergeleken, behouden hun onderlinge volgorde.
sortenreversewijzigen de array;toSortedentoReversedkopiëren.- De huidige volgorde omkeren levert niet noodzakelijk een gesorteerde volgorde op.
5.2 Orden en maak gegevens op voor de lezer
Mensen verwachten dat de volgorde van tekst en de opmaak van getallen de conventies van een taal volgen. Bewaar waarden in vormen die gemakkelijk te verwerken zijn, kies een expliciete landinstelling voor tekstvergelijking en maak de uiteindelijke uitvoer op voor de lezer.
Vergelijk tekst met regels van een landinstelling
a.localeCompare(b, locale) geeft een negatief getal terug als a vóór b komt, een positief getal als het erna komt en nul als ze als gelijk worden vergeleken. Alleen het teken is gegarandeerd, niet exact -1 of 1.
const names = ["Zoe", "Émile", "adam"];
const sorted = names.toSorted((a, b) => a.localeCompare(b, "en"));
// sorted is ["adam", "Émile", "Zoe"]
Een landinstelling is een taalcode zoals “en”, “de” of “sv”. Het Duits plaatst “ä” vóór “z”, terwijl het Zweeds die na “z” plaatst. Geef de bedoelde taal van de pagina door om die keuze expliciet te maken. Zonder landinstelling bepalen de standaardinstellingen van de uitvoeringsomgeving de volgorde.
Gewone vergelijkingen met < vergelijken nog steeds tekencodes. Woorden van elkaar aftrekken levert NaN op, wat bij het sorteren werkt als een vergelijking met gelijk resultaat; het levert geen alfabetische volgorde op.
Stel nuttige vergelijkingsopties in
Met { numeric: true } worden reeksen cijfers als getallen vergeleken. Als je ["file10", "file2", "file1"] sorteert met (a, b) => a.localeCompare(b, "en", { numeric: true }), krijg je ["file1", "file2", "file10"]. Een gewone tekstsortering plaatst “file10” vóór “file2”.
In het Engels behandelt { sensitivity: "base" } varianten in hoofdlettergebruik en accenten, zoals “a”, “A” en “á”, als gelijk. Deze regels hangen af van de taal: het Zweeds behandelt “a” en “ä” als verschillende basisletters. Gebruik de bedoelde landinstelling zowel bij vergelijken op overeenkomst als bij sorteren.
Hergebruik bij veel vergelijkingen een tekstvergelijker:
const collator = new Intl.Collator("en", { numeric: true });
const sorted = files.toSorted(collator.compare);
collator.compare is al een vergelijkingsfunctie. Door die eenmaal te maken, voorkom je dat dezelfde opties voor de landinstelling tijdens een grote sortering steeds opnieuw worden ingesteld.
Sorteer datums voordat je ze opmaakt
Strings met vaste breedte in de vorm YYYY-MM-DD plaatsen het jaar vóór de maand en de dag. Tekstsortering volgt dan de datumvolgorde: ["2026-03-15", "2025-11-02", "2026-01-20"].sort() geeft ["2025-11-02", "2026-01-20", "2026-03-15"].
Tekst met de dag eerst, zoals “15/03/2026” en “20/01/2025”, vergelijkt eerst de dag en kan daardoor het latere jaar voorop plaatsen. Sla deze datums op en sorteer ze in ISO-vorm en maak aan het einde tekst voor de weergave.
Bouw leesbare lijsten en getallen op
join(", ") gebruikt overal hetzelfde scheidingsteken. Intl.ListFormat voegt het laatste verbindingswoord van de taal toe:
const list = new Intl.ListFormat("en-US", {
style: "long", type: "conjunction"
});
list.format(["Ana", "Ben", "Cleo"]);
// "Ana, Ben, and Cleo"
“en-GB” levert “Ana, Ben and Cleo” op; “nl” levert “Ana, Ben en Cleo” op. Een alternatief gebruikt in het Engels “or”. Twee namen geven “Ana and Ben” zonder komma.
(1234.5).toLocaleString("en-US") geeft “1,234.5”, terwijl “de-DE” “1.234,5” geeft. Deze resultaten zijn strings. Sorteer numerieke gegevens voordat je toLocaleString met map toepast; als je eerst opmaakt, vervang je numerieke waarden door tekst waarvan de interpunctie de tekstsortering beïnvloedt.
Belangrijkste punten
- Gebruik
localeCompareof een herbruikbareIntl.Collatorvoor taalafhankelijke volgorde. - Gebruik het teken van het vergelijkingsresultaat, niet exact
-1of1. numeric: trueordent cijferreeksen binnen namen op een natuurlijke manier.- ISO-datumstrings met vaste breedte worden als tekst chronologisch gesorteerd.
Intl.ListFormatvoegt een passend verbindingswoord voor de taal toe.- Sorteer getallen eerst en maak ze als laatste op.
5.3 Kopieer arrays zonder onbedoelde wijzigingen te delen
Een arrayvariabele bevat een referentie naar een array. Als je die variabele aan een andere naam toewijst, wordt de array gedeeld. Met spreadsyntaxis kun je een nieuwe buitenste array maken, lijsten combineren of elementen als afzonderlijke functieargumenten doorgeven.
Maak onderscheid tussen toewijzen en kopiëren
const a = [1, 2, 3];
const b = a;
b.push(4);
// a and b both refer to [1, 2, 3, 4].
console.log(a === b); // true
Er is één array met twee namen. const verhindert niet dat een van beide namen wordt gebruikt om de array te wijzigen. Voor een nieuwe buitenste array is een echte kopieerbewerking nodig:
const c = [...a];
c.push(5);
// c is [1, 2, 3, 4, 5]; a stays [1, 2, 3, 4].
console.log(c === a); // false
De drie punten leggen de elementen van a uit binnen een nieuwe arrayliteral. Als je ze weglaat, heeft dat een ander effect: [a] maakt een array met één element, namelijk de volledige array a. [...a] bevat de elementen van a afzonderlijk.
Combineer en voeg in
[...[1, 2], ...[3, 4]] geeft [1, 2, 3, 4], net als [1, 2].concat([3, 4]). [...first, 99, ...second] plaatst één extra element tussen twee lijsten. [...list, "new"] maakt een verlengde array, terwijl list.push("new") de bestaande array wijzigt. Spreadsyntaxis behoudt de volgorde van de elementen van elke invoer.
Herken een oppervlakkige kopie
const grid = [[1, 2], [3, 4]];
const copy = [...grid];
copy[0].push(9);
// grid[0] and copy[0] are both [1, 2, 9].
De buitenste arrays verschillen, maar hun rijelementen verwijzen nog steeds naar dezelfde binnenste arrays. Dit is een oppervlakkige kopie. Als je copy[0] vervangt door een nieuwe rij, verandert alleen de gekopieerde buitenste array; als je de bestaande rij wijzigt, verandert de gedeelde rij. structuredClone(grid) maakt een onafhankelijke diepe kopie van deze geneste arrays.
Spreid waarden uit in een aanroep
Math.max(...[3, 9, 4]) geeft drie afzonderlijke argumenten door en geeft 9 terug. Als je de array rechtstreeks doorgeeft, geeft Math.max([3, 9, 4]) één array door en levert NaN op. Lege spreadsyntaxis geeft Math.max(...[]) === -Infinity en Math.min(...[]) === Infinity.
Zeer grote arrays kunnen de argumentenlimiet van een engine overschrijden wanneer je ze in een aanroep uitspreidt. Er is geen universeel veilig aantal elementen. Gebruik een lus of reduce om een uiterste waarde voor grote invoer te vinden. Spreadsyntaxis in een arrayliteral maakt geen lijst met functieargumenten.
Spreid strings uit en werk kopieën bij
[..."hello"] levert vijf strings met elk één letter op. Spreadsyntaxis voor strings bezoekt Unicode-codepunten: [..."a😀"] heeft twee elementen, terwijl "a😀".split("") drie UTF-16-code-eenheden heeft. Sommige zichtbare symbolen combineren meerdere codepunten, dus levert uitspreiden geen algemene telling van zichtbare tekens op. Een getal is niet itereerbaar; [...5] geeft een TypeError.
In een parameterlijst gebruikt function total(...nums) restsyntaxis om argumenten in een array te verzamelen. Spreadsyntaxis in een aanroep doet het omgekeerde: die geeft afzonderlijke argumenten door.
Voor bijwerkingen op basis van kopieën geeft [10, 20, 30].with(1, 25) de waarde [10, 25, 30] en geeft .toSpliced(1, 1) de waarde [10, 30]. Ook toSorted en toReversed behouden de bronarray. Dit zijn oppervlakkige kopieën, dus geldt dezelfde regel voor het delen van binnenste arrays.
Belangrijkste punten
- Toewijzing deelt een array; spreadsyntaxis in een arrayliteral maakt een nieuwe buitenste array.
- Als je spreadsyntaxis weglaat, nest je een array als één element.
- Spreadsyntaxis kan arrays combineren en extra elementen invoegen zonder mutatie.
- Een oppervlakkige kopie deelt nog steeds binnenste arrays;
structuredClonekopieert deze geneste arrays diep. - Spreadsyntaxis in een aanroep geeft afzonderlijke argumenten door en is ongeschikt voor invoer van onbeperkte omvang.
- Spreadsyntaxis voor strings bezoekt codepunten; restparameters verzamelen argumenten.
withentoSplicedmaken gewijzigde kopieën.
Lussen en arrays in JavaScript: voorbeelden
1Volg een lus van de eerste controle tot het verlaten ervan
12 stappen
- 1IntroductieVolg wat verandert
Een lus herhaalt een lichaam, maar het resultaat hangt af van de volgorde van controles en veranderingen. We volgen een klein totaal één iteratie tegelijk, kiezen daarna een lus op basis van een voorwaarde (while controleert eerst, do...while na één uitvoering) en sturen een geneste zoekactie met break en continue om te stoppen of over te slaan.
Houd twee vragen gescheiden: welke waarde bereikt het lichaam en welke waarde laat de volgende controle mislukken? De laatste mislukte controle hoort bij de uitvoeringsvolgorde, ook al wordt het lichaam daarbij niet uitgevoerd.
- 2VoorbeeldZet een lopend totaal op
We willen het totaal van
2,4en6. De teller kiest elk getal, terwijl een aparte accumulator de som bijhoudt.let total = 0; for (let n = 2; n <= 6; n += 2) { total += n; }De initialisatie stelt
neenmaal in op2. De eerste controle,2 <= 6, slaagt. De eerste uitvoering van het lichaam telt twee bij nul op, waardoortotalop2komt. De bijwerking verandertndaarna in4. - 3VoorbeeldVolg de overige controles
De volgende controle accepteert
4, dus wordt het totaal2 + 4, oftewel6. De bijwerking brengt de teller naar6, wat nog steeds voldoet aann <= 6. Als je die laatste waarde optelt, wordt het totaal12.Daarna verandert de bijwerking
nin8. Nu is8 <= 6onwaar en stopt de lus. Het lichaam is drie keer uitgevoerd en de voorwaarde is vier keer gecontroleerd. Er is geen acht bij het totaal opgeteld. - 4UitdagingVerander één eindpunt
Wat zou het eindtotaal zijn als de lus hierboven
n < 6gebruikte in plaats vann <= 6, en waarom?---reveal---
Het totaal zou
6zijn: alleen2en4bereiken het lichaam. Bijn = 6is de voorwaarde al onwaar, dus wordt zes nooit opgeteld. De bijwerking bereikt nog steeds zes, maar een waarde in de luskop bereiken garandeert geen iteratie die die waarde gebruikt. - 5UitlegLaat een resultaat bepalen wanneer de lus stopt
Stel dat een batchgrootte begint bij
5en verdubbelt totdat die minstens30bereikt. Een while-lus kan het werk dat nog nodig is rechtstreeks uitdrukken.let size = 5; let rounds = 0; while (size < 30) { size *= 2; rounds++; }De groottes worden
10,20en40. De lus eindigt na drie rondes, omdat veertig de eerste bereikte grootte is waarvoor nog een verdubbeling niet nodig is. - 6KernpuntBepaal of een eerste uitvoering nodig is
Een while-lus controleert voordat die iets doet. Als de begingrootte al
40is, wordt de vorige lus nul keer uitgevoerd. Een do...while-lus zou de grootte eenmaal verdubbelen voordat de lus vaststelt dat nog een uitvoering niet nodig is.Gebruik die controle achteraf wanneer één uitvoering onderdeel van de taak is. Bij het tellen van cijfers door telkens één cijfer te verwijderen, moet nul als een getal met één cijfer worden geteld. Daarom is een eerste uitvoering van het lichaam nuttig.
- 7UitdagingLees een lus die achteraf controleert
Wat zijn
nenrunsna deze code?let n = 1; let runs = 0; do { n *= 3; runs++; } while (n < 8);---reveal---
nis9enrunsis2. De eerste uitvoering van het lichaam levert drie op en de controle slaagt. De tweede levert negen op en de controle mislukt. De controle vindt na elke vermenigvuldiging plaats, dus kan de eindwaarde de grens overschrijden. - 8VoorbeeldSla een waarde over zonder de lus te beëindigen
Deze lus drukt alleen de toegestane tellerwaarden af.
for (let n = 1; n <= 5; n++) { if (n === 3) continue; console.log(n); }De lus drukt
1,2,4,5af. Bij drie slaat continue het afdrukken over, maar de bijwerking in de luskop gaat nog steeds naar vier. Met break zou de hele lus bij drie stoppen en zou geen latere waarde worden afgedrukt. - 9UitdagingZoek een bijwerking die wordt overgeslagen
Waarom maakt deze code bij
n = 2geen voortgang meer?let n = 0; while (n < 4) { if (n === 2) continue; n++; }---reveal---
Continue springt direct naar de while-voorwaarde en slaat
n++over. Bij twee is elke latere controle waar en slaat elke uitvoering van het lichaam de bijwerking opnieuw over. Verhoog de teller in die tak voordat je doorgaat, of gebruik een for-lus waarvan de luskop de bijwerking uitvoert. - 10VoorbeeldVolg een binnenste zoekactie
Voor elke buitenste waarde begint een binnenste lus opnieuw.
for (let a = 1; a <= 3; a++) { for (let b = 1; b <= 4; b++) { if (a * b === 6) break; console.log(a, b); } }Bij
a = 2beëindigt het bereiken vanb = 3die binnenste lus voordat het paar wordt afgedrukt. De buitenste lus gaat nog wel verder naar drie. Een gewone break stuurt alleen de binnenste lus. - 11UitdagingBeëindig de hele geneste zoekactie
De geneste zoekactie moet volledig stoppen bij het eerste product van zes. Met welke wijziging bereik je dat en welk paar veroorzaakt de stop?
---reveal---
Geef de buitenste lus het label
outer:en vervang de break doorbreak outer;. Het eerste overeenkomende paar isa = 2,b = 3: rij één heeft geen product van zes, daarna bereikt rij twee het product in de derde kolom. Beide lussen eindigen op dat punt, dus wordt rij drie nooit uitgevoerd. - 12SamenvattingLees het uitvoeringspad
Volg de initialisatie eenmaal en daarna elke voorwaarde, elk lichaam en elke bijwerking op volgorde. Tel alleen geslaagde toegang tot het lichaam als iteratie.
Een while-lus kan het lichaam helemaal overslaan; een do...while-lus kan dat niet. Continue maakt een volgende iteratie mogelijk, maar kan een bijwerking in een while-lus overslaan. Break beëindigt de bijbehorende lus en een label kan die beëindiging uitbreiden naar een buitenste zoekactie. Bepaal in elk geval welke instructie de uitvoering vervolgens bereikt.
2Volg een array en elk methoderesultaat
11 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVolg twee resultaten van een wijziging
- 2VoorbeeldKoppel waarden aan indexen
- 3UitdagingLees een geneste planning
- 4VoorbeeldVoeg een taak toe en bewaar de retourwaarde
- 5VoorbeeldVervang een taak met splice
- 6UitdagingKopieer een bereik
- 7UitlegZoek expliciet naar een positie
- 8UitdagingSplits en voeg tekst samen
- 9KernpuntHoud numerieke tekst gescheiden van getallen
- 10UitdagingZoek voordat je verwijdert
- 11SamenvattingOnderscheid posities, wijzigingen en tekst
3Maak van een lus een bruikbaar resultaat
10 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieKies wat het lichaam nodig heeft
- 2UitlegLees waarden rechtstreeks
- 3UitdagingBezoek elke tweede positie
- 4VoorbeeldBereken een totaal en tel lange ritten
- 5VoorbeeldGebruik het voltooide totaal
- 6UitdagingZoek een uiterste waarde zonder nul te verzinnen
- 7VoorbeeldBouw verschillen tussen aangrenzende waarden op
- 8UitdagingBehoud alleen toenames
- 9TipVerwijder vanaf het einde wanneer indexen verschuiven
- 10SamenvattingKies een beginwaarde voor elk resultaat
4Volg een reeks callbackbewerkingen
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieLaat de methode het bezoeken regelen
- 2UitlegGeef een expressie of een blokresultaat terug
- 3UitdagingKies een methode voor afgedrukte uitvoer
- 4VoorbeeldBehoud geselecteerde metingen
- 5VoorbeeldTransformeer de geselecteerde waarden
- 6UitdagingBehoud geldige nullen
- 7UitlegZoek één waarde of de positie ervan
- 8UitdagingHerken een overeenkomst met nul
- 9KernpuntControles op één en alle elementen zijn op verschillende momenten klaar
- 10VoorbeeldBegin een reductie expliciet
- 11TipZorg op elk pad voor een volgende accumulator
- 12UitdagingVolg een gefilterd totaal
- 13UitdagingOnderzoek een conversiecallback
- 14UitdagingKies alle overeenkomsten of één overeenkomst
- 15SamenvattingLees elke vorm van het teruggegeven resultaat
5Behoud gegevens tijdens het ordenen en opmaken
13 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieMaak afzonderlijke keuzes voor volgorde en identiteit
- 2VoorbeeldControleer de standaardvolgorde
- 3UitlegGebruik het teken van de vergelijkingsfunctie
- 4UitdagingBescherm de volgorde van de bronarray
- 5VoorbeeldLaat de taal de tekstvolgorde bepalen
- 6UitdagingOrden genummerde labels
- 7VerbandRond berekeningen af vóór de weergave
- 8VoorbeeldGeef dezelfde array een tweede naam
- 9VoorbeeldKopieer de buitenste lijst
- 10UitdagingZoek een gedeelde binnenste rij
- 11TipGeef argumenten door zonder een enorme aanroep te maken
- 12UitdagingCombineer ordenen, kopiëren en opmaken
- 13SamenvattingVolg wat wordt gedeeld en teruggegeven
Lussen en arrays in JavaScript: oefenvragen
Set 1: Wijzig arrays en bouw resultaten op met lussen10 Oefenvragen
Vraag 1 van 10
Wat bevat size na deze instructies?
const tags = ["new", "open"];
const size = tags.push("done");
Toon antwoordVerberg antwoord
push voegt “done” toe aan de bestaande array en geeft de nieuwe lengte, drie, terug. De array zelf bevat nu drie strings, maar die array is niet de retourwaarde van de aanroep. Als je die twee resultaten verwart, sla je een getal op waar latere code een lijst verwacht.Vraag 2 van 10
Wat zijn cut en data daarna?
const data = [4, 8, 12, 16];
const cut = data.splice(1, 2, 7);
Toon antwoordVerberg antwoord
splice twee elementen, acht en twaalf, en voegt zeven op die positie in. De methode geeft de verwijderde elementen terug en laat de gewijzigde bronarray achter als [4, 7, 16]. Als je alleen acht verwijdert, behandel je het tweede argument als een uitgesloten eindindex, zoals bij slice.Vraag 3 van 10
if (items.indexOf(target)) vervangen?Toon antwoordVerberg antwoord
-1 te vergelijken, accepteer je elke geldige positie en wijs je een mislukte zoekactie af. Een controle met > 0 mist nog steeds een element aan het begin, precies een van de gevallen die de oplossing moet afhandelen.Vraag 4 van 10
labels op volgorde?Toon antwoordVerberg antwoord
for...of leest de itereerbare array en levert de waarden op volgorde. for...in levert eigenschapsnamen, zoals indexen als strings, en zou dus niet rechtstreeks de labels leveren. De numerieke lengte beschrijft het aantal posities en is zelf geen itereerbare lijst.Vraag 5 van 10
Wat is de eindwaarde van count?
let count = 0;
for (const n of [11, 6, 14, 9]) {
if (n >= 10) count++;
}
Toon antwoordVerberg antwoord
count += n nodig zou zijn. Deze lus telt overeenkomsten in plaats van hun numerieke waarden op te tellen.Vraag 6 van 10
Wat blijft na deze code in values over?
const values = [3, 6, 8, 9];
for (let i = 0; i < values.length; i++) {
if (values[i] % 3 === 0) values.splice(i, 1);
}
Toon antwoordVerberg antwoord
[6, 8] overblijft. Het resultaat [8] gaat ervan uit dat elk veelvoud van drie wordt gecontroleerd en ziet de waarde over het hoofd die na de eerste verschuiving wordt overgeslagen.Vraag 7 van 10
"7;12;5".split(";").join(" / ") op?Toon antwoordVerberg antwoord
["7", "12", "5"]; samenvoegen plaatst “ / ” ertussen om één string te maken. Er is geen afsluitend scheidingsteken omdat join dat alleen tussen elementen invoegt. De numerieke array zou ook conversie vereisen en zou niet het resultaat van join zijn.Vraag 8 van 10
Welke array wordt opgebouwd?
const readings = [9, 4, 8, 3];
const rises = [];
for (let i = 1; i < readings.length; i++) {
const change = readings[i] - readings[i - 1];
if (change > 0) rises.push(change);
}
Toon antwoordVerberg antwoord
[4] oplevert. [8] slaat de latere meting op in plaats van de verandering, terwijl de array met drie veranderingen de voorwaarde negeert die afnames afwijst.Vraag 9 van 10
Wat zijn de lengte en het laatste element van a daarna?
const a = [2, 4];
a[5] = 12;
Toon antwoordVerberg antwoord
Vraag 10 van 10
0 het verkeerde resultaat opleveren?Toon antwoordVerberg antwoord
Set 2: Volg lussen en lees arrayposities10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Hoe vaak wordt dit luslichaam uitgevoerd?
for (let i = 2; i < 7; i++) {
console.log(i);
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
["oak", "pine", "elm", "fir"].at(-2) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
Welke waarde wordt afgedrukt?
let n = 8;
do {
n -= 3;
} while (n > 6);
console.log(n);
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Welke waarde bevat total daarna?
let total = 0;
for (let n = 3; n <= 9; n += 3) {
total += n;
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Welke getallen worden op volgorde afgedrukt?
for (let n = 2; n <= 7; n++) {
if (n === 4) continue;
if (n === 6) break;
console.log(n);
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Welk paar waarden leveren grid.length en grid[1][2] op?
const grid = [[6, 2, 8], [9, 5, 1]];
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Hoeveel iteraties worden uitgevoerd voordat deze lus eindigt?
let size = 3;
let rounds = 0;
while (size < 20) {
size *= 2;
rounds++;
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Hoe vaak wordt count++ uitgevoerd?
let count = 0;
for (let a = 0; a < 4; a++) {
for (let b = a + 1; b < 4; b++) {
if (b === 3) break;
count++;
}
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Deze omzetting moet dezelfde waarden afdrukken als een tellus die 2 overslaat. Hoe kun je die herstellen met behoud van de while-vorm?
let i = 0;
while (i < 4) {
if (i === 2) continue;
console.log(i);
i++;
}
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
[9, 2, 9].lastIndexOf(9) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Transformeer, doorzoek en reduceer arrays10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
[4, 7].map(n => { n + 3; }) terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Welke array levert deze expressie op?
[5, 16, 9, 22].filter(n => n > 10).map(n => n - 2)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
[8, 0, 6].find(n => n < 2) terug en hoe moet je voor deze numerieke array controleren of de zoekactie is geslaagd?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Welke waarde geeft deze reductie terug?
[6, 3, 5].reduce((total, n) => total + n, 4)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Welke waarden worden afgedrukt en wat wordt aan result toegewezen?
const result = [2, 5, 8].forEach(n => {
if (n === 5) return;
console.log(n);
});
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Geldige metingen omvatten nul; alleen null betekent ontbrekend. Welke expressie converteert alle geldige metingen naar meters?
const km = [0, null, 1.2, 0.4];
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Wat geeft de code terug?
[64, 40, 91].reduce((count, score) => {
if (score >= 60) return count + 1;
}, 0)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
70 is. Welke expressie handelt alle invoergroottes af?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Wat levert deze expressie op?
["6", "15", "4"].map(Number)
.filter(n => n % 2 === 0)
.map((n, i) => n + i)
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Sorteer, kopieer en combineer resultaten veilig10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
[8, 30, 4].toSorted() terug?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
Welke arrays bevatten a en c daarna?
const a = [6, 2];
const b = a;
const c = [...a];
b.push(9);
c[0] = 1;
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
readings van groot naar klein ordenen en de oorspronkelijke reeks behouden?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
"part12", "part3" en "part1" in natuurlijke numerieke naamvolgorde zonder parts te wijzigen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Wat zijn rows[0] en copy[1] daarna?
const rows = [[5], [8]];
const copy = [...rows];
copy[0].push(6);
copy[1] = [2];
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
[1200, 25, 4] op met numbers.map(n => n.toLocaleString("de-DE")).toSorted(). Hoe moet het de waarden ordenen en opmaken om numbers te behouden en de waarden in oplopende getalvolgorde weer te geven?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Welke array wordt teruggegeven?
["lion", "ox", "bear", "ant"]
.toSorted((a, b) => a.length - b.length)
.toReversed()
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Wat bevat view daarna?
const values = [7, 2, 5];
const i = values.findIndex(n => n < 0);
values.splice(i, 1);
const view = values.toReversed();
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
Wat is de lengte van joined?
const left = [4, 6];
const right = [8, 10, 12];
const joined = [...left, right];
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
["08/02/2027", "19/01/2026", "03/12/2026"] in de vorm dag/maand/jaar. Welke opgeslagen strings geven voor dezelfde datums een chronologische tekstvolgorde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
Aanwezigheidscontrole
drinks.includes("tea") beantwoordt of die exacte string in kleine letters in de array aanwezig is.Accumulator
Afronding bij drijvendekommagetallen
0.1 optellen levert 0.9999999999999999 op, zodat een exact eindpunt van een lus kan worden gemist.Array
[18, 21, 19, 24] bevat vier dagelijkse temperatuurmetingen onder één variabelenaam.Array-identiteit
[1, 2] === [1, 2] is onwaar omdat de literals twee afzonderlijke arrays maken.Arraylengte
4, wordt de lengte minstens vijf, ook als eerdere posities leeg zijn.B
Beginwaarde
0 op te geven, geeft een lege somreductie nul terug in plaats van een TypeError.Bijwerking
i += 5 maakt de volgende tellerwaarde vijf groter dan de vorige.Break-instructie
break, zodat latere waarden niet worden gecontroleerd nadat een overeenkomst is opgeslagen.C
Callback
Continue-instructie
continue gebruiken om het afdrukken over te slaan terwijl de teller van een for-lus nog wel wordt bijgewerkt.D
Diepe kopie
Do...while-lus
Doorlopen via indexen
arr.length - 1 en verlaagt de index zolang die minstens nul is.E
Element
["red", "green", "blue"] is de string “green” het element dat op index 1 is opgeslagen.Entries-methode
for (const [i, name] of names.entries()) kan genummerde labels afdrukken met i + 1.Every-methode
F
Filter-methode
t => t > 20 selecteert warme metingen zonder ze door booleaanse waarden te vervangen.Find-methode
[3, 0, 5] geeft nul terug, een geslaagde maar falsy-overeenkomst.FindIndex-methode
-1 voor geen overeenkomst is.For...in-lus
For...of-lus
for (const fruit of fruits) leest fruitnamen rechtstreeks, zodat het lichaam elke naam kan verwerken.G
Geneste array
grid[1][0] selecteert de eerste index een rij en de tweede een waarde binnen die rij.Geneste lus
Getalopmaak
1234.5 met “de-DE” opmaakt, krijg je “1.234,5”, een string om na numeriek sorteren weer te geven.Grensfout van één positie
i <= arr.length lees je bij het doorlopen van een array één index voorbij het laatste element.I
Index
colors[2], omdat indexering vanaf nul vóór index één begint.Initialisatie
for (let i = 1; i <= 5; i++) maakt de initialisatie i met beginwaarde 1.ISO-datumstring
Iteratie
1 tot en met 5 afdrukken met één afdruk per uitvoering van het lichaam kost vijf iteraties.Itereerbare waarde
5 uitspreiden in een array geeft een TypeError.J
Join-methode
["2026", "03", "15"].join("-") levert de datumstring “2026-03-15” op.L
Landinstelling
Lege arraypositie
new Array(3) maakt drie lege posities, terwijl [3] één expliciet opgeslagen element maakt.Lijstopmaak
LocaleCompare-methode
a.localeCompare(b, "en") plaatst a vóór b in die vergelijking.Luslabel
break outer; bij een overeenkomst kun je beide lussen beëindigen wanneer de buitenste lus het label outer heeft.Lusvoorwaarde
i < 10 eindigt de lus bij het bereiken van i = 10 voordat het lichaam opnieuw wordt uitgevoerd.M
Map-methode
km => km * 1000 bouwt overeenkomstige metingen in meters op.Methodeketen
Mutatie
scores.push(95) wijzigt scores, ook wanneer de variabele met const is gedeclareerd.N
Neveneffect
undefined terug.O
Omkering
[3, 1, 2] geeft [2, 1, 3], wat geen numeriek gesorteerde reeks is.Oneindige lus
while (n < 3) voor onbepaalde tijd dezelfde waarde laten afdrukken.Oplopende volgorde
[10, 9, 1] numeriek in oplopende volgorde sorteert, krijg je [1, 9, 10].Oppervlakkige kopie
P
Parameter
(value, i) ontvangt de tweede parameter de index van het huidige element.Pijlfunctie
n => n * 2 ontvangt één getal en geeft een waarde terug die twee keer zo groot is.Predicaat
n => n !== null behoudt geldige metingen met waarde nul en wijst metingen met null af.Push en pop
push een naam aan het einde toevoegen en die laatste naam later met pop verwijderen.R
Reduce-methode
Reductiestap
count + 1 of het ongewijzigde aantal terug.Referentie
const b = a verandert de aanroep b.push(4) ook de array die via a wordt gelezen.Restparameter
function total(...nums) verzamelt nums de afzonderlijke argumenten in één array.Retourwaarde
{ n * 2; } berekent een product, maar geeft het niet terug om op te slaan.S
Shift en unshift
queue.shift() verwijdert de eerste wachtende naam en verplaatst de volgende naam naar index nul.Slice-methode
values.slice(1, 3) kopieert de waarden op index één en twee naar een nieuwe array.Some-methode
Sortering binnen de bestaande array
const ordered = scores.sort(...) verwijzen ordered en scores naar dezelfde array.Splice-methode
days.splice(2, 0, "Wed") voegt een dag in op index twee zonder een bestaande dag te verwijderen.Split-methode
Spreadsyntaxis
[...first, ...second] plaatst de waarden van beide arrays in een nieuwe buitenste array.Stabiele sortering
T
Tekstvergelijker
numeric: true sorteert namen met cijfers in een natuurlijke numerieke volgorde.Teller
U
Uitvoeringstabel
V
Vergelijkingsfunctie
(a, b) => a - b plaatst kleinere numerieke waarden vóór grotere.Vlag
Voortijdig stoppen
W
While-lus
while (balance < 1500) om te herhalen totdat de doelwaarde is bereikt.Z
Zoeken naar een index
[3, 7, 3].lastIndexOf(3) geeft 2 terug, de positie van het laatste overeenkomende element.Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.