
Az includes() JavaScript függvény működése eltér a többi korábbi tömbfüggvény működéséhez képest, mint amilyen például a find(), filter(), vagy akár a map().
Az includes() függvénnyel el tudjuk dönteni, hogy egy adott érték benne van-e egy tömbben vagy nincs. Igen válasz esetén true a visszatérési érték, nemleges válasz pedig false-t eredményez.
A függvénynek két paramétere van. Az első kötelező. Ez a vizsgálandó elem, ami bármilyen érték lehet. A második paraméter megadása nem kötelező. Ez egy egész szám, hogy az includes() hányadik elemtől kezdje a keresést.
Így működik az includes egy paraméterrel
Kiindulásként csináltam egy tömböt, ami számokat tartalmaz:
const tomb = [1,2,3,4,5];
Először a 2 értéket, majd a 10 értéket fogom megkerestetni a függvénnyel (az eredményt azonnal a konzolba küldöm):
console.log(tomb.includes(2)); // true
console.log(tomb.includes(10)); // false
Az eredmény magáért beszél. A 2 benne volt a tömbben, a 10 pedig nem.
Így működik az includes két paraméterrel
Nézzük meg a második paraméter használatát, amikor megmondom az includes()-nak, hogy légyszi egy konkrét indextől kezdve keresd nekem az adott elemet, köszi szépen! :).
console.log(tomb.includes(2, 0)); // true
console.log(tomb.includes(2, 3)); // false
Nem lesz meglepetés a végeredmény. Az első esetben igazat kapunk, mert a 2-őt keressük a legelső elemtől, aminek az indexe 0.
A második hívás pedig hamisat ad vissza. Ugyanis bár szintén a 2-őt keresem, de megmondtam a függvénynek, hogy a 3. indexű elemtől kezdje a keresést, ami a tömbben a 4-es elem. Tehát az includes() fogta magát, és a 4-től kezdve vizsgálta, hogy a 2 benne van-e a tömb(részlet)ben. És mivel nem találta, false-t adott vissza.
Objektum keresése (trükkös lesz)
Na és most keressünk objektumot! Adott egy objektumokat tartalmazó tömb:
const objTomb = [{id:1}, {id:2}, {id:3}];
Hogyan keresnénk meg mondjuk az {id:2} objektumot?
Hát így:
console.log(objTomb.includes({id:2}));
Ha megnézzük a konzolt, akkor ott az van, hogy false. Na de, hogy a bánatba? Hiszen az {id:2} objektum igenis benne van a tömbben!
Okés, akkor elmondom mi a csavar a sztoriban. Szóval az objektumok referencia típusok, vagyis ha egy objektumot el akarunk érni, akkor a rá mutató hivatkozásra van szükség. Ezért, amikor az includes-nek átadtam a {id:2} objektumot, akkor az egy teljesen másik objektum, mint ami a tömbön belül van. Ez egy tök más objektum a memóriában, a kettőnek köze sincs egymáshoz, noha a kulcs és az érték is egyezik. Nekünk a tömbön belüli objektumra mutató hivatkozás kell.
Szóval így a helyes:
const objRef = objTomb[1]; // objRef = {id:2}
console.log(objTomb.includes(objRef)); // most már true
Mit csináltam? Létrehoztam egy változót és beállítottam, hogy mutasson az tömbben levő {id:2} objektumra. Így az includes-nak magát a hivatkozást adtam át, ami tényleg arra az objektumra mutat, ami a tömbben hesszel.
Kitérő: objektumok és primitív adattípusok
Hogy könnyebb legyen megérteni az előző példában tárgyalt objektum referenciával kapcsolatos „horror sztorit”, itt egy videó, ami pontosan erről szól:
Működő példa
És végül készítettem egy példát online is. Ide kattintva lehet kipróbálni. (Mivel a repl.it egy angol nyelvű weboldal, az ottani példában angolul neveztem el a változókat.)