# cum să eliminați duplicatele matrice în ES6

iată 3 moduri de a filtra duplicatele dintr-o matrice și de a returna numai valorile unice. Preferatul meu este folosind set pentru că este cel mai scurt și mai simplu 😁

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. Folosind set

permiteți-mi să încep mai întâi prin a explica ce Set este:

Set este un nou obiect de date introdus în ES6. Deoarece Set vă permite să stocați numai valori unice. Când treci într-o matrice, se va elimina orice valori duplicat.

bine, să ne întoarcem la codul nostru și să descompunem ceea ce se întâmplă. Există 2 lucruri se întâmplă:

  1. în primul rând, creăm un nou Set prin trecerea unui tablou. Deoarece Set permite doar valori unice, toate duplicatele vor fi eliminate.
  2. acum duplicatele au dispărut, o vom converti înapoi într-o matrice utilizând operatorul de răspândire ...
const array = ;// Step 1const uniqueSet = new Set(array);// Set { '🐑', 1, 2, 3 }// Step 2const backToArray = ;// 

# conversia setat la o matrice folosind matrice.de la

alternativ, puteți utiliza, de asemenea, Array.from pentru a converti un Set într-o matrice:

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

# 2: Folosind filtru

pentru a înțelege această opțiune, să trecem prin ceea ce fac aceste două metode: indexOf și filter

# indexOf

metoda indexOf returnează primul index pe care îl găsește al elementului furnizat din matricea noastră.

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

# filtru

metoda filter() creează o nouă matrice de elemente care trec condiționalul pe care îl oferim. Cu alte cuvinte, dacă elementul trece și returnează true, acesta va fi inclus în matricea filtrată. Și orice element care nu reușește sau să se întoarcă false, acesta nu va fi să fie în matrice filtrat.

să pășim și să parcurgem ceea ce se întâmplă pe măsură ce trecem prin matrice.

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;});

mai jos este ieșirea din consolă.jurnalul a arătat mai sus. Duplicatele sunt în cazul în care indicele nu se potrivește cu indexOf. Deci, în aceste cazuri, condiția va fi falsă și nu va fi inclusă în matricea noastră filtrată.

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

# Regăsiți valorile duplicate

de asemenea, putem folosi metoda de filtrare pentru a prelua valorile duplicate din matrice. Putem face acest lucru prin simpla ajustare a stării noastre așa:

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

din nou, să pas prin acest lucru și a vedea de ieșire:

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: Folosind reduceți

metoda reduce este utilizată pentru a reduce elementele matricei și a le combina într-o matrice finală bazată pe o funcție de reductor pe care o treceți.

în acest caz, funcția reductorului nostru verifică dacă matricea noastră finală conține elementul. Dacă nu, împinge acel element în matricea noastră finală. În caz contrar, săriți acel element și returnați doar matricea noastră finală așa cum este (în esență săriți peste acel element).

reducerea este întotdeauna un pic mai dificil de înțeles, așa că haideți să pas, de asemenea, în fiecare caz și a vedea de ieșire:

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:// ;

și iată ieșirea din consolă.jurnal:

element acumulator (înainte de funcția reductor) împinge la acumulator? acumulator (după funcția reductor)
🐑 Da
1 Da
2 Da
🐑 nu
🐑 nu
3 Da

# Contribuția comunității

  • @smokkku: array.includes(item) este un mod mai idiomatic de a testa dacă matricea conține elementul

  • @riquelkovsky: chiar astăzi am făcut acest lucru făcând următoarele.Object.keys(array.reduce((map, next) => ({...map, : true}), {}))

-@luisiacc2: sigur, Set() va face trucul pentru valorile primitve, cu obiecte o soluție non O(n^2) ar efectua mai întâi un sort() pe matrice(care funcționează în O(nlogn)), apoi căutați elementele adiacente egale(care este O(n)), deci aveți O(n + nlogn).

  • @Iamdipankarj: de asemenea, Array.from(new Set()), dar acest lucru funcționează numai pe primitive. Pentru filtrarea duplicatelor în matrice de obiecte personalizate matrice.filter() este calea de urmat.

  • @benawad: filter timpul de execuție este O(n^2)

Lasă un răspuns

Adresa ta de email nu va fi publicată.