Mikor kell ez?
„csak azokat, amelyek…”, „válogasd ki a …-eket”, „hány darab olyan van, ami…”, „jelenjenek meg a … filmek”. Ha az eredmény kevesebb elemű lehet, mint a kiindulás, filter kell – nem map.
const filmek = [
{ cim: "Mátrix", ev: 1999, perc: 136, mufaj: "sci-fi" },
{ cim: "Alien", ev: 1979, perc: 117, mufaj: "horror" },
{ cim: "Duna", ev: 2021, perc: 155, mufaj: "sci-fi" },
{ cim: "Hetedik", ev: 1995, perc: 127, mufaj: "krimi" },
{ cim: "Interstellar", ev: 2014, perc: 169, mufaj: "sci-fi" }
];
// 1) szűrés egy feltétellel
const regiek = filmek.filter(film => film.ev < 2000);
// 2) szöveges mező – mindig ===, sosem ==
const sciFi = filmek.filter(film => film.mufaj === "sci-fi");
// 3) DARABSZÁM: szűrés után .length
const db = filmek.filter(film => film.perc > 130).length;
// 4) ha nincs találat: ÜRES TÖMB, nem hiba
const nincs = filmek.filter(film => film.perc > 200);
console.log(regiek.map(f => f.cim));
console.log(sciFi.map(f => f.cim));
console.log(db);
console.log(nincs, nincs.length);
console.log(filmek.length); // az eredeti VÁLTOZATLAN
- Kimenet
- [ 'Mátrix', 'Alien', 'Hetedik' ]
[ 'Mátrix', 'Duna', 'Interstellar' ]
3
[] 0
5
Új nyelvi elem · filter
A filter minden elemre meghívja a kapott callbacket, és azokat az elemeket gyűjti új tömbbe, amelyeknél a callback igaz értéket adott vissza. Az elemeket nem alakítja át – ugyanazokat adja vissza, csak kevesebbet.
A különbség a map-hez képest a callback dolgában van: a map callbackje értéket számol, a filter callbackje eldönt. A film.ev < 2000 nem szám és nem szöveg, hanem true vagy false.
Klasszikus alak → új alak
Ahogy eddig írtad
const regiek = [];
for (const film of filmek) {
if (film.ev < 2000) {
regiek.push(film);
}
}
Ahogy mostantól
const regiek =
filmek.filter(f => f.ev < 2000);
Mit nyerünk vele? A bal oldalon az if és a push együtt hordozza a feltételt – ha elrontod valamelyiket, csendben rossz lesz az eredmény. A jobb oldalon egyetlen dolgot kell megfogalmazni: mikor kell egy elem. A gyűjtést a filter végzi.
Illesztési pontok
«film» – a callback paraméterének nevét te adod; szokás egyes számban nevezni azt, amiből a tömb áll.
«film.ev < 2000» – ide bármilyen igaz/hamis kifejezés jöhet, akár összetett is: f.ev < 2000 && f.mufaj === "sci-fi".
- Darabszámhoz tedd a végére a
.length-et – ez a „hány darab olyan van” típusú feladat kész megoldása.
- Szöveges mező összehasonlítása mindig
===-szel, és pontosan ugyanúgy írva, ahogy az adatban áll (kis- és nagybetű számít).
Tipikus hibák
filmek.filter(f => f.cim) – itt nem feltétel áll, hanem érték. Minden nem üres szöveg igaznak számít, ezért minden elem átmegy. Ha az összes elemet visszakapod, ezt nézd meg.
filmek.filter(f => { f.ev < 2000; }) – kapcsos zárójel return nélkül. Minden elemre undefined jön vissza, az pedig hamis: az eredmény []. Ha egyetlen elemet sem kapsz vissza, ezt nézd meg.
- A
filter használata átalakításra. Nem alakít át, csak válogat – ha az elemeket is meg akarod változtatni, utána map kell (lásd P20).
- Az eredmény eldobása:
filmek.filter(…) értékadás nélkül semmit nem változtat.