🔍 Perché usare Set o Map al posto di Array.includes: una questione di performance

 


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).

🔗 Ti piace Techelopment? Dai un'occhiata al sito per tutti i dettagli!

⚠️ 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/Map se devi fare molti controlli di presenza in collezioni grandi.
  • Usa Array se 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
telegram: @techelopment_channel
whatsapp: Techelopment
youtube: @techelopment