Filtrare un array per ottenere elementi unici
Abbiamo un array arr
.
Create una funzione unique(arr)
che ritorni un array con elementi unici.
Ad esempio:
function unique(arr) { /* your code */ } let strings = ["Hare", "Krishna", "Hare", "Krishna", "Krishna", "Krishna", "Hare", "Hare", ":-O" ]; alert( unique(strings) ); // Hare, Krishna, :-O
Attraversiamo gli elementi dell’array:
- Per ogni elemento controlliamo se l’array risultante già lo contiene.
- Se lo troviamo, passiamo al prossimo, altrimenti lo aggiungiamo.
function unique(arr) { let result = []; for (let str of arr) { if (!result.includes(str)) { result.push(str); } } return result; } let strings = ["Hare", "Krishna", "Hare", "Krishna", "Krishna", "Krishna", "Hare", "Hare", ":-O" ]; alert( unique(strings) ); // Hare, Krishna, :-O
Il codice funziona, ma c’è un potenziale problema di performace.
Il metodo result.includes(str)
internamente attraversa l’array result
e confronta ogni elemento con str
per trovare una corrispondenza.
Quindi se ci sono 100
elementi in result
e nessuna corrispondenza con str
, attraverseremo l’intero array result
eseguendo essattamente 100
confronti. Se l’array result
è grande, ad esempio 10000
, ci sarebbero 10000
di confronti.
Non è propriamente un problema, perché il motore JavaScript è molto rapido, quindi un array grande 10000
è questione di pochi microsecondi.
Ma dovremo eseguire questo test per ogni elemento di arr
nel ciclo for
.
Quindi se arr.length
è 10000
avremmo qualcosa come 10000*10000
= 100 milioni di confronti. Sono molti.
Quindi la soluzione funziona bene solo con array di piccola taglia.
Più avanti nel capitolo Map e Set vedremo come ottimizare questo metodo.