# Sådan fjernes Array dubletter i ES6

her er 3 måder at filtrere dubletter fra et array og returnere kun de unikke værdier. Min favorit bruger sæt, 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. Brug af set

Lad mig starte først med at forklare, hvad sæt er:

Set er et nyt dataobjekt introduceret i ES6. Fordi Set kun lader dig gemme unikke værdier. Når du passerer i et array, vil det fjerne eventuelle dublerede værdier.

Okay, lad os gå tilbage til vores kode og nedbryde, hvad der sker. Der er 2 ting der foregår:

  1. for det første opretter vi en ny Set ved at passere et array. Da Set kun tillader unikke værdier, fjernes alle dubletter.
  2. nu er duplikaterne væk, vi skal konvertere det tilbage til et array ved hjælp af spread operator ...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;// 

# konverter sæt til et Array ved hjælp af Array.fra

Alternativt kan du også bruge Array.from til at konvertere en Set til et array:

const array = ;Array.from(new Set(array));// 

# 2: Brug af filter

for at forstå denne mulighed, lad os gennemgå, hvad disse to metoder gør: indexOf og filter

# indeksaf

indexOf – metoden returnerer det første indeks, den finder af det leverede element fra vores array.

const array = ;array.indexOf('🐑'); // 0array.indexOf(1); // 1array.indexOf(2); // 2array.indexOf(3); // 5

# filter

metoden filter() opretter et nyt udvalg af elementer, der passerer den betingede, vi leverer. Med andre ord, hvis elementet passerer og returnerer true, vil det blive inkluderet i det filtrerede array. Og ethvert element, der fejler eller returnere false, vil det være ikke være i den filtrerede array.

lad os træde ind og gå igennem, hvad der sker, når vi løber gennem 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 udgangen fra konsollen.log viste ovenfor. Duplikaterne er, hvor indekset ikke svarer til indeksenaf. Så i disse tilfælde vil tilstanden være falsk og vil ikke blive inkluderet i vores filtrerede 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

# Hent duplikatværdierne

vi kan også bruge filtermetoden til at hente duplikatværdierne fra arrayet. Vi kan gøre dette ved blot at justere vores tilstand som sådan:

const array = ;array.filter((item, index) => array.indexOf(item) !== index);// 

igen, lad gå igennem dette og se output:

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: Brug af reducer

reduce – metoden bruges til at reducere elementerne i arrayet og kombinere dem til et endeligt array baseret på en reduktionsfunktion, som du passerer.

i dette tilfælde kontrollerer vores reduktionsfunktion, om vores endelige array indeholder varen. Hvis det ikke gør det, skub det element ind i vores endelige array. Ellers skal du springe over det element og returnere bare vores endelige array som det er (i det væsentlige springe over det element).

reducer er altid lidt mere vanskelig at forstå, så lad os også træde ind i hvert enkelt tilfælde og se output:

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 output fra konsollen.log:

vare akkumulator (før Reduceringsfunktion) skub til akkumulator? akkumulator (efter Reduceringsfunktion)
🐑 Ja
1 Ja
2 Ja
🐑 Nej
🐑 Nej
3 Ja

# Fællesskabets input

  • @smokkku: array.includes(item) er mere idiomatisk måde at teste, om array indeholder varen

  • @rikelkovsky : lige i dag gjorde jeg det ved at gøre følgende.Object.keys(array.reduce((map, next) => ({...map, : true}), {}))

-@luisiacc2: sikker på, Set() vil gøre tricket for primitve værdier, med objekter en ikke O(n^2) løsning ville først udføre en sort() på arrayet(som opererer i O(nlogn)), og derefter søge efter adjacents lige elementer(som er O(n)), så du fik O(n + nlogn).

  • @iamdipankarj: også, Array.from(new Set()) , men dette virker kun på primitiver. Til filtrering dubletter i array af brugerdefinerede objekter Array.filter() er vejen frem.

  • @benavad: filter køretid er O(n^2)

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.