oto 3 sposoby filtrowania duplikatów z tablicy i zwracania tylko unikalnych wartości. Moim ulubionym jest używanie zestawu, ponieważ jest najkrótszy i najprostszy 😁
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. Używając set
zacznę od wyjaśnienia czym jest Set:
Set
jest nowym obiektem danych wprowadzonym w ES6. Ponieważ Set
pozwala przechowywać tylko unikalne wartości. Gdy przekażesz tablicę, usunie ona wszystkie zduplikowane wartości.
dobra, wróćmy do naszego kodu i omówmy co się dzieje. Dzieją się 2 rzeczy:
- najpierw tworzymy nową
Set
przekazując tablicę. PonieważSet
zezwala tylko na unikalne wartości, wszystkie duplikaty zostaną usunięte. - teraz duplikaty zniknęły, zamierzamy przekonwertować je z powrotem na tablicę za pomocą operatora spread
...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;//
# Konwertuj Zestaw na tablicę za pomocą Array.z
Alternatywnie możesz również użyć Array.from
, aby przekonwertować Set
na tablicę:
const array = ;Array.from(new Set(array));//
# 2: Używając filtra
aby zrozumieć tę opcję, przejdźmy przez to, co robią te dwie metody: indexOf
i filter
# indexOf
metoda indexOf
zwraca pierwszy znaleziony indeks podanego elementu z naszej tablicy.
const array = ;array.indexOf('🐑'); // 0array.indexOf(1); // 1array.indexOf(2); // 2array.indexOf(3); // 5
# filter
metoda filter()
tworzy nową tablicę elementów, które przechodzą warunkowe, które udostępniamy. Innymi słowy, jeśli element przejdzie i zwróci true
, zostanie uwzględniony w filtrowanej tablicy. I każdy element, który zawiedzie lub zwróci false
, nie będzie w filtrowanej tablicy.
wejdźmy i przejdźmy przez to, co się dzieje, gdy przejdziemy przez tablicę.
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;});
Poniżej znajduje się wyjście z konsoli.log pokazany powyżej. Duplikaty są tam, gdzie indeks nie pasuje do indexOf. Więc w tych przypadkach warunek będzie false i nie będzie zawarty w naszej filtrowanej tablicy.
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 |
# Pobierz zduplikowane wartości
możemy również użyć metody filtrowania, aby pobrać zduplikowane wartości z tablicy. Możemy to zrobić po prostu dostosowując nasz stan w ten sposób:
const array = ;array.filter((item, index) => array.indexOf(item) !== index);//
ponownie, niech krok przez to i zobaczyć wyjście:
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: Użycie reduce
metoda reduce
służy do redukcji elementów tablicy i łączenia ich w końcową tablicę opartą na jakiejś funkcji reduktora, którą przekazujesz.
w tym przypadku nasza funkcja reduktora sprawdza, czy nasza końcowa tablica zawiera element. Jeśli nie, wciśnij ten element do naszej tablicy końcowej. W przeciwnym razie pomiń ten element i zwróć tylko naszą tablicę końcową, jaka jest (zasadniczo pomijając ten element).
redukcja jest zawsze nieco trudniejsza do zrozumienia, więc przejdźmy również do każdego przypadku i zobaczmy wyjście:
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:// ;
a to wyjście z konsoli.log:
pozycja | akumulator (przed funkcją reduktora) | Push do akumulatora? | akumulator (po funkcji reduktora) |
---|---|---|---|
🐑 |
|
tak. |
|
1 |
|
tak. |
|
2 |
|
tak. |
|
🐑 |
|
Nie. |
|
🐑 |
|
Nie. |
|
3 |
|
tak. |
|
# Wkład Wspólnoty
-
@smokkku:
array.includes(item)
jest bardziej idiomatycznym sposobem sprawdzania, czy tablica zawiera element -
@riquelkovsky: właśnie dzisiaj zrobiłem to, wykonując następujące czynności.
Object.keys(array.reduce((map, next) => ({...map, : true}), {}))
-@luisiacc2: oczywiście, Set()
zrobi sztuczkę dla wartości podstawowych, z obiektami nie O(n^2)
rozwiązaniem byłoby najpierw wykonać sort()
na tablicy(która działa w O(nlogn)
), a następnie wyszukać adjacents równe pozycje(co jest O(n)
), więc masz O(n + nlogn)
.
-
@iamdipankarj: również
Array.from(new Set())
, ale to działa tylko na prymitywach. Do filtrowania duplikatów w tablicy obiektów niestandardowych.filter()
-
@benawad:
filter
czas uruchomienia toO(n^2)