her er 3 måter å filtrere ut duplikater fra en matrise og returnere bare de unike verdiene. Min favoritt bruker Sett fordi det er den korteste og enkleste 😁
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. Bruke set
La meg starte først ved å forklare Hva Settet er:
Set
er et nytt dataobjekt introdusert I ES6. Fordi Set
bare lar deg lagre unike verdier. Når du passerer i en matrise, vil den fjerne eventuelle dupliserte verdier.
Ok, la Oss gå tilbake til koden vår og bryte ned hva som skjer. Det er 2 ting som skjer:
- Først oppretter vi en ny
Set
ved å sende en matrise. FordiSet
bare tillater unike verdier, fjernes alle duplikater. - nå er duplikatene borte, vi skal konvertere den tilbake til en matrise ved å bruke spredningsoperatoren
...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;//
# Konverter Satt til En Matrise ved Hjelp Av Array.fra
Alternativt kan du også bruke Array.from
til å konvertere en Set
til en matrise:
const array = ;Array.from(new Set(array));//
# 2: Bruk filter
for å forstå dette alternativet, la oss gå gjennom hva disse to metodene gjør: indexOf
og filter
# indexOf
metoden indexOf
returnerer den første indeksen den finner av det angitte elementet fra matrisen.
const array = ;array.indexOf('🐑'); // 0array.indexOf(1); // 1array.indexOf(2); // 2array.indexOf(3); // 5
# filter
metoden filter()
oppretter en ny rekke elementer som passerer betinget vi gir. Med andre ord, hvis elementet passerer og returnerer true
, vil det bli inkludert i den filtrerte matrisen. Og ethvert element som mislykkes eller returnerer false
, vil det IKKE v re i det filtrerte arrayet.
La oss gå inn og gå gjennom hva som skjer når vi går gjennom arrayet.
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;});
Nedenfor er utgangen fra konsollen.logg viste ovenfor. Duplikatene er der indeksen ikke samsvarer med indexOf. Så i disse tilfellene vil tilstanden være falsk og vil ikke bli inkludert i vårt filtrerte utvalg.
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 |
# Hent duplikatverdiene
Vi Kan også bruke filtermetoden til å hente duplikatverdiene fra arrayet. Vi kan gjøre dette ved å justere vår tilstand som så:
const array = ;array.filter((item, index) => array.indexOf(item) !== index);//
Igjen, la gå gjennom dette og se utgangen:
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: Bruke reduser
reduce
– metoden brukes til å redusere elementene i matrisen og kombinere dem til en endelig matrise basert på en reduksjonsfunksjon som du passerer.
i dette tilfellet sjekker vår reduksjonsfunksjon om vårt siste utvalg inneholder varen. Hvis det ikke gjør det, skyv det elementet inn i vårt siste utvalg. Ellers hopper du over det elementet og returnerer bare vårt siste utvalg som det er (i hovedsak hopper over det elementet).
Reduser er alltid litt vanskeligere å forstå, så la oss også gå inn i hvert tilfelle og se utgangen:
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:// ;
Og her er resultatet fra konsollen.logg inn:
Vare | Akkumulator (Før Reduksjonsfunksjon) | Trykk Til Akkumulator? | Akkumulator (Etter Reduksjonsfunksjon) |
---|---|---|---|
🐑 |
|
Ja |
|
1 |
|
Ja |
|
2 |
|
Ja |
|
🐑 |
|
Nei |
|
🐑 |
|
Nei |
|
3 |
|
Ja |
|
# Fellesskapsinngang
-
@smokkku:
array.includes(item)
er mer idiomatisk måte å teste om array inneholder elementet -
@riquelkovsky: Bare i dag gjorde jeg dette ved å gjøre følgende.
Object.keys(array.reduce((map, next) => ({...map, : true}), {}))
-@luisiacc2: Jo, Set()
vil gjøre trikset for primitve verdier, med objekter en ikke O(n^2)
løsning vil først utføre en sort()
på arrayet (som opererer i O(nlogn)
), og deretter søke etter adjacents like elementer(som er O(n)
) , så du fikk O(n + nlogn)
.
-
@Iamdipankarj: Også,
Array.from(new Set())
, men dette fungerer bare på primitiver. For filtrering duplikater i rekke tilpassede objekter Array.filter()
er veien å gå. -
@benawad:
filter
kjøretid erO(n^2)