# jak usunąć duplikaty tablicy w ES6

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:

  1. najpierw tworzymy nową Setprzekazując tablicę. Ponieważ Set zezwala tylko na unikalne wartości, wszystkie duplikaty zostaną usunięte.
  2. 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 to O(n^2)

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.