Výběr prvků: filter()
V lekcích o cyklech a objektech jste napsali spoustu cyklů, které procházejí pole: aby z něj vybraly některé prvky, posbíraly jejich jména nebo jeden z nich našly. To programy potřebují pořád, a proto mají pole metody, které to udělají za vás, každá na jediném řádku. Každá metoda v této lekci nahrazuje cyklus, který už umíte napsat.
Tady je cyklus, který vybere teploty nad 20 stupňů:
const teploty = [18, 24, 27, 15, 21];
const teple = [];
for (const teplota of teploty) {
if (teplota > 20) {
teple.push(teplota);
}
}
console.log(teple);[24, 27, 21]Metoda filter() udělá totéž na jednom řádku:
const teple = teploty.filter((teplota) => teplota > 20);
console.log(teple);[24, 27, 21]Argumentem metody filter() je funkce, tady šipková funkce (teplota) => teplota > 20. filter() ji zavolá pro každý prvek pole a předá jí ho jako argument. Když funkce vrátí true, prvek se dostane do nového pole. Když vrátí false, prvek se vynechá. Funkce je tedy podmínka z příkazu if v cyklu. Funkci, kterou předáte jiné funkci, aby ji pak sama volala, se říká callback (čte se „kólbek“).
filter() původní pole nemění: v teploty je pořád všech pět čísel. Vrátí nové pole a to si uložíte do proměnné. Když podmínku nesplní žádný prvek, je nové pole prázdné: [].
V poli objektů dostane callback pokaždé jeden celý objekt, stejně jako proměnná cyklu for...of:
const zvirata = [
{ jmeno: "Toník", druh: "slon", vek: 12 },
{ jmeno: "Leo", druh: "lev", vek: 6 },
{ jmeno: "Žofka", druh: "žirafa", vek: 4 },
{ jmeno: "Pepík", druh: "tučňák", vek: 2 }
];
const mlada = zvirata.filter((zvire) => zvire.vek < 5);
console.log(mlada);
console.log("Mladá zvířata:", mlada.length);[{ jmeno: "Žofka", druh: "žirafa", vek: 4 }, { jmeno: "Pepík", druh: "tučňák", vek: 2 }]
Mladá zvířata: 2Délka nového pole říká, kolik prvků podmínku splnilo. Je to vzor počítání z lekce o cyklech, jen na jednom řádku.
Typické chyby:
- Výsledek se nepoužije. Samotný řádek
teploty.filter((teplota) => teplota > 20);vytvoří nové pole a hned ho zahodí a vteplotyzůstane všechno, jak bylo. Výsledek si uložte do proměnné, nebo ho vypište. - Složené závorky bez
return, jako v lekci o funkcích.(teplota) => { teplota > 20 }vrátíundefined, což se počítá jako nepravda, a tak bude nové pole vždycky prázdné.
Jak psát:
Pokyny
Test splnil, kdo získal aspoň 30 bodů. Vytvořte konstantu uspeli a pomocí filter() do ní uložte výsledky žáků, kteří test splnili. Vypište uspeli: v konzoli by se měly objevit výsledky Anny, Kláry a Evy.
Pod to vypište, kolik žáků test nesplnilo (mají méně než 30 bodů): Neuspěli: 2. Použijte filter() a length.