Ricerca…
introduzione
L'oggetto Set consente di memorizzare valori univoci di qualsiasi tipo, siano essi valori primitivi o riferimenti a oggetti.
Gli oggetti set sono raccolte di valori. È possibile scorrere gli elementi di un set nell'ordine di inserimento. Un valore nel Set può verificarsi solo UNA VOLTA ; è unico nella collezione del Set. I valori distinti vengono discriminati utilizzando l'algoritmo di confronto SameValueZero .
Sintassi
- nuovo set ([iterable])
- mySet.add (valore)
- mySet.clear ()
- mySet.delete (valore)
- mySet.entries ()
- mySet.forEach (callback [, thisArg])
- mySet.has (valore)
- mySet.values ()
Parametri
Parametro | Dettagli |
---|---|
iterabile | Se viene passato un oggetto iterabile, tutti i suoi elementi verranno aggiunti al nuovo Set. null viene considerato non definito. |
valore | Il valore dell'elemento da aggiungere all'oggetto Set. |
richiama | Funzione da eseguire per ciascun elemento. |
thisArg | Opzionale. Valore da utilizzare quando si esegue la richiamata. |
Osservazioni
Poiché ogni valore nel Set deve essere unico, l'uguaglianza del valore sarà verificata e non si basa sullo stesso algoritmo utilizzato nell'operatore ===. In particolare, per Set, +0 (che è strettamente uguale a -0) e -0 sono valori diversi. Tuttavia, questo è stato modificato nell'ultima specifica ECMAScript 6. A partire da Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (bug 952870) e un recente nightly Chrome, +0 e -0 vengono considerati come lo stesso valore in Set objects. Inoltre, NaN e undefined possono anche essere memorizzati in un Set. NaN è considerato uguale a NaN (anche se NaN! == NaN).
Creare un set
L'oggetto Set consente di memorizzare valori univoci di qualsiasi tipo, siano essi valori primitivi o riferimenti a oggetti.
È possibile inserire elementi in un set e iterarli in modo simile a un semplice array JavaScript, ma a differenza dell'array, non è possibile aggiungere un valore a un Set se il valore esiste già in esso.
Per creare un nuovo set:
const mySet = new Set();
Oppure puoi creare un set da qualsiasi oggetto iterabile per dargli dei valori iniziali:
const arr = [1,2,3,4,4,5];
const mySet = new Set(arr);
Nell'esempio sopra il contenuto dell'insieme sarebbe {1, 2, 3, 4, 5}
. Si noti che il valore 4 viene visualizzato solo una volta, a differenza dell'array originale utilizzato per crearlo.
Aggiungere un valore a un Set
Per aggiungere un valore a un Set, usa il metodo .add()
:
mySet.add(5);
Se il valore esiste già nel set, non verrà aggiunto di nuovo, poiché i Set contengono valori univoci.
Nota che il metodo .add()
restituisce il set stesso, quindi puoi concatenare le chiamate di aggiunta:
mySet.add(1).add(2).add(3);
Rimozione del valore da un set
Per rimuovere un valore da un set, utilizzare il metodo .delete()
:
mySet.delete(some_val);
Questa funzione restituirà true
se il valore è presente nell'insieme ed è stato rimosso, oppure false
altrimenti.
Verifica se esiste un valore in un set
Per verificare se esiste un determinato valore in un set, utilizzare il metodo .has()
:
mySet.has(someVal);
Restituisce true
se someVal
appare nell'insieme, false
altrimenti.
Cancellare un set
Puoi rimuovere tutti gli elementi in un set usando il metodo .clear()
:
mySet.clear();
Ottenere la lunghezza impostata
Puoi ottenere il numero di elementi all'interno del set usando la proprietà .size
const mySet = new Set([1, 2, 2, 3]);
mySet.add(4);
mySet.size; // 4
Questa proprietà, a differenza di Array.prototype.length
, è di sola lettura, il che significa che non è possibile cambiarlo assegnandogli qualcosa:
mySet.size = 5;
mySet.size; // 4
In modalità rigorosa genera persino un errore:
TypeError: Cannot set property size of #<Set> which has only a getter
Conversione di set su array
A volte potrebbe essere necessario convertire un set ad un array, ad esempio per essere in grado di utilizzare Array.prototype
metodi come .filter()
. Per fare ciò, usa Array.from()
o destructuring-assignment
:
var mySet = new Set([1, 2, 3, 4]);
//use Array.from
const myArray = Array.from(mySet);
//use destructuring-assignment
const myArray = [...mySet];
Ora puoi filtrare l'array in modo che contenga solo numeri pari e riconvertirli in Set usando Set constructor:
mySet = new Set(myArray.filter(x => x % 2 === 0));
mySet
ora contiene solo numeri pari:
console.log(mySet); // Set {2, 4}
Intersezione e differenza negli insiemi
Non ci sono metodi incorporati per l'intersezione e la differenza nei Set, ma è comunque possibile ottenerli ma convertirli in array, filtrarli e convertirli in Set:
var set1 = new Set([1, 2, 3, 4]),
set2 = new Set([3, 4, 5, 6]);
const intersection = new Set(Array.from(set1).filter(x => set2.has(x)));//Set {3, 4}
const difference = new Set(Array.from(set1).filter(x => !set2.has(x))); //Set {1, 2}
Set Iterating
Puoi usare un semplice ciclo for-it per iterare un Set:
const mySet = new Set([1, 2, 3]);
for (const value of mySet) {
console.log(value); // logs 1, 2 and 3
}
Durante l'iterazione su un set, restituirà sempre i valori nell'ordine in cui sono stati aggiunti per la prima volta al set. Per esempio:
const set = new Set([4, 5, 6])
set.add(10)
set.add(5) //5 already exists in the set
Array.from(set) //[4, 5, 6, 10]
Esiste anche un metodo .forEach()
, simile a Array.prototype.forEach()
. Ha due parametri, callback
, che verrà eseguito per ciascun elemento e optional thisArg
, che verrà utilizzato come this
quando si esegue la callback
.
callback
ha tre argomenti. I primi due argomenti sono entrambi l'elemento corrente di Set (per coerenza con Array.prototype.forEach()
e Map.prototype.forEach()
) e il terzo argomento è il Set stesso.
mySet.forEach((value, value2, set) => console.log(value)); // logs 1, 2 and 3