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 dellarray:
- Per ogni elemento controlliamo se larray 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 larray 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 lintero array result eseguendo essattamente 100 confronti. Se larray 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.