Spring til indhold
Academi.dk

JavaScript

map, filter og find

Let øvet DA↔EN-ordliste 1 øvelse

map, filter og find er de tre array-metoder, du bruger mest. De tager en funktion med ind og kører den på hvert element: map laver en ny liste af ændrede værdier, filter en ny liste med dem, der opfylder et krav, og find det første element, der passer.

Forudsætter, at du har set arrays , funktioner i javascript .

En funktion som ingrediens

De her metoder gør noget, der virker mærkeligt første gang: du giver en funktion med som argument. Metoden kalder så din funktion én gang for hvert element.

Eksempel
const tal = [1, 2, 3, 4];

const fordoblet = tal.map(function (t) {
return t * 2;
});

console.log(fordoblet);
console.log(tal);

Output

Tryk på “Kør koden”.

Læg mærke til, at det oprindelige array er uændret. map laver et nyt array. Det er en pointe, der går igen: de her metoder ændrer ikke listen, de laver en ny.

Med en arrow function bliver det kortere, og det er den form, du vil se overalt:

Eksempel
const tal = [1, 2, 3, 4];

console.log(tal.map((t) => t * 2));

Output

Tryk på “Kør koden”.

Når en arrow function kun består af ét udtryk, kan du droppe krølleparenteserne og return. Værdien bliver returneret automatisk.

map: lav hvert element om

map giver altid et array af samme længde som det oprindelige.

Eksempel
const studerende = [
{ navn: "Ida", karakter: 10 },
{ navn: "Omar", karakter: 7 },
{ navn: "Sofie", karakter: 4 }
];

const navne = studerende.map((s) => s.navn);
console.log(navne);

Output

Tryk på “Kør koden”.

Det er den typiske måde at trække ét felt ud af en liste objekter, for eksempel lige inden data skal vises på en side.

filter: behold nogle af dem

filter giver et array, der er kortere eller lige så langt. Din funktion skal returnere true for dem, der skal med.

Eksempel
const studerende = [
{ navn: "Ida", karakter: 10 },
{ navn: "Omar", karakter: 7 },
{ navn: "Sofie", karakter: 4 }
];

const bedste = studerende.filter((s) => s.karakter >= 7);
console.log(bedste.map((s) => s.navn));

Output

Tryk på “Kør koden”.

De to kan altså sættes sammen: først filtrér, så map. Det læses fra venstre mod højre som en sætning: “tag dem med karakter over 7, og giv mig deres navne”.

find: kun den første

Eksempel
const studerende = [
{ navn: "Ida", karakter: 10 },
{ navn: "Omar", karakter: 7 }
];

const fundet = studerende.find((s) => s.navn === "Omar");
console.log(fundet);

const ikkeFundet = studerende.find((s) => s.navn === "Karl");
console.log(ikkeFundet);

Output

Tryk på “Kør koden”.

Finder den ingen, får du undefined. Derfor ser du så ofte et tjek lige efter: if (fundet) { … }.

reduce: læg det hele sammen til én værdi

reduce er den sværeste af dem, og den, der oftest bliver spurgt til. Den samler hele listen til én værdi.

Eksempel
const priser = [120, 45, 300];

const total = priser.reduce((sum, pris) => sum + pris, 0);
console.log(total);

Output

Tryk på “Kør koden”.

sum er det, der er samlet indtil nu, pris er det aktuelle element, og 0 til sidst er startværdien. Første gennemløb er sum altså 0 og pris 120.

Hvornår vælger du hvad?

Du vil…Brug
lave alle elementer ommap
beholde nogle af demfilter
finde ét bestemtfind
tjekke om mindst ét passersome
tjekke om alle passerevery
lægge sammen til én værdireduce
bare gøre noget for hverforEach

Alt det her kan også skrives med en almindelig for-løkke, og i starten er det helt fint at gøre det. Metoderne er kortere at læse, når man er vant til dem, og de fortæller læseren, hvad hensigten er, i stedet for bare hvordan det gøres.

Kort opsamling

  • Alle tre tager en funktion, der kaldes for hvert element.
  • map giver samme længde, filter kortere, find ét element eller undefined.
  • Ingen af dem ændrer det oprindelige array.
  • forEach giver ingen værdi tilbage.

Øv dig

Læs videre

Senest gennemgået .