In

Insiemi in JavaScript

2 esercizi

Informazioni su Insiemi

In JavaScript, un set è una struttura dati simile a un array che può contenere solo valori primitivi e/o riferimenti a oggetti unici.

I set devono essere creati usando il costruttore Set; possono essere inizializzati con dei valori passando un array al costruttore.

const emptySet = new Set();
const setWithInitialValues = new Set(['hello', 'world']);

Aggiungere e rimuovere elementi

Un valore non può essere aggiunto a un set se è strettamente uguale a uno qualsiasi degli elementi del set.

const set = new Set();
set.add(10);
set.add(10); // 10 is strictly equal to 10, so it can't be added again
set.size;
//=> 1;

set.has(10);
//=> true
set.delete(10);
//=> true; 10 was removed
set.delete(10);
//=> false; 10 is not in the set, so nothing happened

const obj = { color: 'magenta' };
const eerilySimilarObj = { color: 'magenta' };

set.add(obj);
set.add(eerilySimilarObj); // obj and eerilySimilarObj reference different objects, so they can both be added
set.size;
//=> 2

set.clear();
set.size;
//=> 0

Convertire tra set e array

Gli array vengono convertiti in set usando il costruttore Set. I set possono essere convertiti in array usando la sintassi di espansione oppure Array.from().

const arrayWithDuplicates = [7, 3, 3, 9, 3];
const arrayWithoutDuplicates = [...new Set(arrayWithDuplicates)]; // [7, 3, 9]
const anotherArrayWithoutDuplicates = Array.from(new Set(arrayWithDuplicates)); // [7, 3, 9]

Iterazione

Un set è una collezione indicizzata: i suoi elementi sono indicizzati da una chiave e possono essere iterati nell'ordine di inserimento. Poiché la chiave e il valore di un elemento di un set coincidono, Set.keys() e Set.values() sono intercambiabili.

const apples = ['Granny Smith', 'Honey Crisp', 'Royal Gala'];
const appleSet = new Set(apples);

for (let apple of appleSet.keys()) {
  console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'

for (let apple of appleSet.values()) {
  console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'

for (let apple of appleSet.entries()) {
  console.log(apple);
}
// ['Granny Smith', 'Granny Smith']
// ['Honey Crisp', 'Honey Crisp']
// ['Royal Gala', 'Royal Gala']

Prestazioni di ricerca rispetto agli array

Quando si sceglie un set per memorizzare una raccolta di dati (invece di un array), in genere è perché i valori memorizzati devono essere unici. Tuttavia, dato che è possibile garantire l'unicità anche con gli array, potrebbe non essere ovvio il motivo.

La risposta breve è che i set sono ottimizzati per la ricerca, mentre gli array no. I metodi di ricerca degli array (come Array.indexOf()) hanno tempi di esecuzione che crescono linearmente con la dimensione dell'array: più elementi contiene l'array, più tempo richiede la ricerca. I metodi di ricerca dei set, invece, hanno tempi di esecuzione costanti, cioè restano gli stessi indipendentemente dalla dimensione del set.

In pratica, però, questa differenza di prestazioni è trascurabile, a meno che la collezione non contenga un'enorme quantità di dati.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Insiemi