tässä on 3 tapaa suodattaa kaksoiskappaleet ryhmästä ja palauttaa vain yksilölliset arvot. Suosikkini käyttää Setiä, koska se on lyhin ja yksinkertaisin.😁
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. Käyttäen joukkoa
aloitan ensin selittämällä, mikä joukko on:
Set
on ES6: ssa esitelty uusi dataobjekti. Koska Set
voit tallentaa vain ainutlaatuisia arvoja. Kun syötät array, se poistaa mahdolliset päällekkäiset arvot.
Okei, palataan koodiimme ja puretaan, mitä tapahtuu. On kaksi asiaa meneillään:
- ensin luodaan uusi
Set
läpäisemällä array. KoskaSet
sallii vain yksilölliset arvot, kaikki kaksoiskappaleet poistetaan. - nyt kaksoiskappaleet ovat poissa, aiomme muuntaa sen takaisin array käyttämällä spread operator
...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;//
# Muunna joukko Array käyttäen Array.
Vaihtoehtoisesti voit myös käyttää Array.from
: ää muuttaaksesi Set
: n arraksi:
const array = ;Array.from(new Set(array));//
# 2: Käyttämällä suodatinta
tämän vaihtoehdon ymmärtämiseksi käydään läpi, mitä nämä kaksi menetelmää tekevät: indexOf
ja filter
# indeksi
indexOf
menetelmä palauttaa ensimmäisen löytämänsä indeksin annetusta alkuaineesta.
const array = ;array.indexOf('🐑'); // 0array.indexOf(1); // 1array.indexOf(2); // 2array.indexOf(3); // 5
# suodatin
filter()
menetelmä luo uuden joukon elementtejä, jotka läpäisevät antamamme ehdollisen. Toisin sanoen, jos Elementti läpäisee ja palauttaa true
, se sisällytetään suodatettuun joukkoon. Ja mikä tahansa elementti, joka epäonnistuu tai palaa false
, se ei ole suodatetussa jonossa.
astutaan sisään ja kävellään läpi, mitä tapahtuu, kun kierrämme joukon läpi.
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;});
alla on lähtö konsolista.loki näkyy yllä. Kaksoiskappaleet ovat siellä, missä indeksi ei vastaa indeksiä. Joten näissä tapauksissa, ehto on väärä ja ei sisälly meidän suodatettu array.
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 |
# Nouda päällekkäiset arvot
voimme myös käyttää suodatusmenetelmää hakeaksemme päällekkäiset arvot matriisista. Voimme tehdä tämän yksinkertaisesti muuttamalla tilaamme näin:
const array = ;array.filter((item, index) => array.indexOf(item) !== index);//
jälleen anna askel tämän läpi ja katso tuotos:
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: Pelkistämällä
reduce
menetelmää käytetään pelkistämään joukon alkuaineita ja yhdistämään ne lopulliseksi ryhmäksi, joka perustuu johonkin ohitettavaan reduktiofunktioon.
tässä tapauksessa reduktiofunktiomme tarkistaa, sisältääkö lopullinen ryhmämme kohteen. Jos se ei toimi, työnnä tuo esine lopulliseen järjestelmäämme. Muuten, ohita että elementti ja palata vain meidän lopullinen array kuten on (lähinnä ohittaa, että elementti).
pelkistys on aina hieman hankalampi ymmärtää, joten astutaan myös jokaiseen juttuun ja katsotaan tuloste:
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:// ;
tässä on lähtö konsolista.loki:
kohta | akku (ennen Vähennystoimintoa) | työnnä akkuun? | akku (Reduktiofunktion jälkeen) |
---|---|---|---|
🐑 |
|
Kyllä |
|
1 |
|
Kyllä |
|
2 |
|
Kyllä |
|
🐑 |
|
Ei |
|
🐑 |
|
Ei |
|
3 |
|
Kyllä |
|
# Yhteisön panos
-
@smokku:
array.includes(item)
on idiomaattisempi tapa testata, sisältääkö array kappaleen -
@riquelkovsky: juuri tänään tein tämän tekemällä seuraavaa.
Object.keys(array.reduce((map, next) => ({...map, : true}), {}))
-@luisiacc2: Toki, Set()
tekee tempun primitve-arvoille, olioilla ei O(n^2)
ratkaisu olisi suorittaa ensin sort()
array(joka toimii O(nlogn)
), ja sitten etsiä adjasentit yhtä suuret kohteet (joka on O(n)
) , joten sait O(n + nlogn)
.
-
@iamdipankarj : myös,
Array.from(new Set())
, mutta tämä toimii vain alkukantaisilla. Suodatukseen kaksoiskappaleet joukko mukautettuja esineitä Array.filter()
on tie. -
@benawad:
filter
juoksuaika onO(n^2)