![]() |
Quando scriviamo codice JavaScript, è facile ricorrere a metodi semplici e intuitivi come Array.includes() per verificare se un elemento è presente in un array. Tuttavia, se stai lavorando con dataset grandi o operazioni ripetute, questo approccio può diventare un collo di bottiglia in termini di performance.
Vediamo perché strumenti come Set e Map possono offrirti tempi di esecuzione migliori, grazie alla loro complessità computazionale O(1).
⚠️ Il problema di Array.includes()
Il metodo includes() scorre tutto l’array per cercare l’elemento specificato. Questo significa che:
- Nel peggiore dei casi,
includes()ha una complessità di tempo O(n). - Più grande è l’array, più tempo serve per la ricerca.
📦 Esempio:
const items = ['a', 'b', 'c', ..., 'z']; // Array lungo
items.includes('z'); // O(n) tempo
Se questo controllo viene fatto migliaia di volte (ad esempio in un ciclo), i tempi si sommano rapidamente.
✅ La soluzione: usare Set
Un Set è una struttura dati che memorizza valori univoci e consente verifiche in tempo costante O(1).
📦 Esempio equivalente:
const itemSet = new Set(['a', 'b', 'c', ..., 'z']);
itemSet.has('z'); // O(1) tempo
🔁 Se devi controllare la presenza di un elemento molte volte, usare Set riduce drasticamente il tempo di esecuzione.
🔐 Quando usare Map
Se hai bisogno di associare chiavi e valori (come un dizionario), Map è la scelta giusta. Anche Map.has(key) opera in tempo O(1), a differenza di dover cercare un oggetto in un array con find() o some().
📦 Esempio con Map:
const userMap = new Map();
userMap.set('alice', { age: 30 });
userMap.set('bob', { age: 25 });
userMap.has('alice'); // O(1)
🚀 Benchmark pratico
Supponiamo di dover controllare 10.000 elementi:
- Con
Array.includes: fino a 10.000 confronti per ogni chiamata. - Con
Set.has: 1 confronto costante, indipendentemente dalla dimensione.
💡 Risultato: Set è decine o centinaia di volte più veloce, soprattutto in cicli o funzioni ad alta frequenza.
❌ Quando non usare Set o Map
Come ogni strumento, Set e Map non sono sempre la scelta ideale. Ecco alcuni casi in cui non conviene usarli:
🔹 1. Collezioni piccole e controlli occasionali
Se hai solo pochi elementi (es. meno di 10) e fai pochi controlli, la differenza di performance è trascurabile. In questi casi, usare un array è più semplice e leggibile.
const colors = ['red', 'green', 'blue'];
if (colors.includes('green')) {
// va benissimo
}
🔹 2. Ordinamento necessario
Set non mantiene un ordine affidabile (tranne l’ordine di inserimento), e Map non è adatta per confronti basati su ordinamento. Se devi fare .sort() o lavorare con indici, meglio usare un array.
🔹 3. Accesso per indice
Set e Map non supportano l’accesso diretto tramite indice (es. array[0]). Se ti serve accedere agli elementi in modo posizionale, l’array resta l’unica opzione.
🔹 4. Serializzazione JSON
Set e Map non vengono serializzati correttamente con JSON.stringify(). Se devi salvare o inviare dati in formato JSON, dovrai prima convertirli manualmente.
JSON.stringify(new Set(['a', 'b'])); // "{}" ❌ non funziona come atteso
🧠 Conclusione
Scegliere tra Array, Set o Map dipende dal contesto:
- Usa
Set/Mapse devi fare molti controlli di presenza in collezioni grandi. - Usa
Arrayse hai pochi dati, lavori con indici o ordini, o ti serve serializzazione semplice.
📌 Performance, leggibilità e semplicità devono sempre guidare la tua scelta.
Follow me #techelopment
Official site: www.techelopment.it
facebook: Techelopment
instagram: @techelopment
X: techelopment
Bluesky: @techelopment
whatsapp: Techelopment
youtube: @techelopment
