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:
- for det første opretter vi en ny
Set
ved at passere et array. DaSet
kun tillader unikke værdier, fjernes alle dubletter. - 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 erO(n^2)