íme 3 módszer a tömbök másolatainak kiszűrésére és csak az egyedi értékek visszaadására. Kedvencem a Set használata, mert ez a legrövidebb és legegyszerűbb 😁
const array = ;// 1: "Set";// 2: "Filter"array.filter((item, index) => array.indexOf(item) === index);// 3: "Reduce"array.reduce( (unique, item) => (unique.includes(item) ? unique : ), ,);// RESULT:// ;
# 1. A set
használata először hadd kezdjem azzal, hogy elmagyarázom, mi a halmaz:
Set
az ES6-ban bevezetett új adatobjektum. Mivel a Set
csak egyedi értékek tárolását teszi lehetővé. Ha átmegy egy tömbben, eltávolítja az ismétlődő értékeket.
Oké, menjünk vissza a kódunkhoz, és bontsuk le, mi történik. Vannak 2 dolgok folynak:
- először egy új
Set
– et hozunk létre egy tömb átadásával. Mivel aSet
csak egyedi értékeket engedélyez, az összes másolat eltávolításra kerül. - most a másolatok eltűntek, a spread operátor használatával vissza fogjuk konvertálni tömbbé
...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;//
# Convert készlet egy tömb segítségével tömb.tól től
Alternatív megoldásként a Array.from
használatával Set
tömböt is konvertálhat:
const array = ;Array.from(new Set(array));//
# 2: Szűrő használata
annak érdekében, hogy megértsük ezt a lehetőséget, nézzük át, mit csinál ez a két módszer: indexOf
és filter
# indexOf
a indexOf
metódus visszaadja a megadott elem első indexét a tömbünkből.
const array = ;array.indexOf('🐑'); // 0array.indexOf(1); // 1array.indexOf(2); // 2array.indexOf(3); // 5
# szűrő
a filter()
módszer új elemtömböt hoz létre, amelyek átmennek az általunk megadott feltételen. Más szóval, ha az elem átmegy, és visszaadja a true
értéket, akkor a szűrt tömbbe kerül. És minden olyan elem, amely sikertelen vagy visszatér false
, akkor nem lesz a szűrt tömbben.
lépjünk közbe, és járjuk végig, mi történik a tömbben.
const array = ;array.filter((item, index) => { console.log( // a. Item item, // b. Index index, // c. indexOf array.indexOf(item), // d. Condition array.indexOf(item) === index, ); return array.indexOf(item) === index;});
az alábbiakban a konzol kimenete látható.a napló fent látható. A másolatok, ahol az index nem egyezik az indexOf. Tehát ezekben az esetekben a feltétel hamis lesz, és nem szerepel a szűrt tömbben.
Item | Index | indexOf | Condition |
---|---|---|---|
🐑 | 0 | 0 | true |
1 | 1 | 1 | true |
2 | 2 | 2 | true |
🐑 | 3 | 0 | false |
🐑 | 4 | 0 | false |
3 | 5 | 5 | true |
# A duplikált értékek lekérése
a szűrési módszert is használhatjuk a duplikált értékek lekérésére a tömbből. Ezt úgy tehetjük meg, hogy egyszerűen beállítjuk az állapotunkat:
const array = ;array.filter((item, index) => array.indexOf(item) !== index);//
ismét lépjünk át ezen, és nézzük meg a kimenetet:
Item | Index | indexOf | Condition |
---|---|---|---|
🐑 | 0 | 0 | false |
1 | 1 | 1 | false |
2 | 2 | 2 | false |
🐑 | 3 | 0 | true |
🐑 | 4 | 0 | true |
3 | 5 | 5 | false |
# 3: A reduce
használata a reduce
módszer a tömb elemeinek csökkentésére szolgál,és azokat egy végső tömbbé kombinálja valamilyen szűkítő funkció alapján.
ebben az esetben a szűkítő funkciónk ellenőrzi, hogy a végső tömb tartalmazza-e az elemet. Ha nem, tolja be azt az elemet a végső tömbünkbe. Ellenkező esetben hagyja ki ezt az elemet, és csak a végső tömbünket adja vissza (lényegében átugorva ezt az elemet).
a csökkentés mindig egy kicsit bonyolultabb megérteni, ezért lépjünk be minden esetben, és nézzük meg a kimenetet:
const array = ;array.reduce((unique, item) => { console.log( // a. Item item, // b. Final Array (Accumulator) unique, // c. Condition (Remember it only get pushed if this returns `false`) unique.includes(item), // d. Reducer Function Result unique.includes(item) ? unique : , ); return unique.includes(item) ? unique : ;}, ); // 👈 The initial value of our Accumulator is an empty array// RESULT:// ;
és itt a kimenet a konzolról.napló:
elem | akkumulátor (szűkítő funkció előtt) | nyomja meg az akkumulátort? | akkumulátor (szűkítő funkció után) |
---|---|---|---|
🐑 |
|
Igen |
|
1 |
|
Igen |
|
2 |
|
Igen |
|
🐑 |
|
nem |
|
🐑 |
|
nem |
|
3 |
|
Igen |
|
# Közösségi input
-
@smokkku:
array.includes(item)
több idiomatikus módon teszteli, hogy tömb tartalmazza az elemet -
@riquelkovsky: csak ma tettem ezt a következőket.
Object.keys(array.reduce((map, next) => ({...map, : true}), {}))
-@luisiacc2: persze, a Set()
megteszi a trükköt a primitve értékeknél, az objektumoknál egy nem O(n^2)
megoldás először sort()
– et hajt végre a tömbben(amely O(nlogn)
– ben működik), majd keresse meg a szomszédos egyenlő elemeket(ami O(n)
), így O(n + nlogn)
– et kap.
-
@iamdipankarj: szintén
Array.from(new Set())
, de ez csak primitíveken működik. Szűrésére ismétlődések tömb egyéni objektumok tömb.filter()
az út. -
@benawad:
filter
futási időO(n^2)