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ă:
- în primul rând, creăm un nou
Set
prin trecerea unui tablou. DeoareceSet
permite doar valori unice, toate duplicatele vor fi eliminate. - 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 esteO(n^2)