# Slik Fjerner Du Array Duplikater I ES6

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:

  1. Først oppretter vi en ny Set ved å sende en matrise. Fordi Set bare tillater unike verdier, fjernes alle duplikater.
  2. 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 er O(n^2)

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.