Set

El objeto Set te permite almacenar valores únicos de cualquier tipo, incluso valores primitivos u objetos de referencia.

Sintaxis

new Set([iterable]);

Parámetros

iterable
Si un objeto iterable es pasado, todos sus elementos serán añadidos al nuevo Set. Si no se especifica este parámetro, o si su valor es null, el nuevo Set estará vacío.

Valor retornado

Una nueva instancia de Set.

Descripción

Los objetos Set son colecciones de valores. Se puede iterar sus elementos en el orden de su inserción. Un valor en un Set sólo puede estar una vez; éste es único en la colección Set.

Igualdad de valores

Ya que cada valor en el Set tiene que ser único, la igualdad del valor será comprobada y esta igualdad no se basa en el mismo algoritmo usado en el operador ===. Específicamente, para Sets, +0 (el cual es estrictamente igual a -0) y -0 son valores distintos. Sin embargo, esto ha cambiado en la última especificación ECMAScript 6. Iniciando con Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (error 952870) y un recent nightly Chrome, +0-0 son tratados como el mismo valor en objetos Set

NaN y undefined también pueden ser almacenados en un Set. NaN es considerado igual que NaN (A pesar que NaN !== NaN).

Propiedades

Set.length
El valor de la propiedad length es 0.
get Set[@@species]
La función constructora que es usada para crear objetos derivados.
Set.prototype
Representa el prototipo para el constructor Set. Permite la adición de propiedades a todos los objetos Set.

Instancias Set

Todas las instancias de Set heredan de Set.prototype.

Propiedades

Set.prototype.constructor
Returns the function that created an instance's prototype. This is the Set function by default.
Set.prototype.size
Returns the number of values in the Set object.

Métodos

Set.prototype.add(value)
Appends a new element with the given value to the Set object. Returns the Set object.
Set.prototype.clear()
Removes all elements from the Set object.
Set.prototype.delete(value)
Removes the element associated to the value and returns the value that Set.prototype.has(value) would have previously returned. Set.prototype.has(value) will return false afterwards.
Set.prototype.entries()
Returns a new Iterator object that contains an array of [value, value] for each element in the Set object, in insertion order. This is kept similar to the Map object, so that each entry has the same value for its key and value here.
Set.prototype.forEach(callbackFn[, thisArg])
Calls callbackFn once for each value present in the Set object, in insertion order. If a thisArg parameter is provided to forEach, it will be used as the this value for each callback.
Set.prototype.has(value)
Returns a boolean asserting whether an element is present with the given value in the Set object or not.
Set.prototype.keys()
Is the same function as the values() function and returns a new Iterator object that contains the values for each element in the Set object in insertion order.
Set.prototype.values()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order.
Set.prototype[@@iterator]()
Returns a new Iterator object that contains the values for each element in the Set object in insertion order.

Ejemplos

Usando el objeto Set

const mySet = new Set();

mySet.add(1);
mySet.add(5);
mySet.add('some text');

const o = {a: 1, b: 2};
mySet.add(o);

mySet.add({a: 1, b: 2}); // La variable "o" referencia a otro objeto, por lo que agrega otro valor.

mySet.has(1); // true
mySet.has(3); // false, 3 no ha sido añadido al Set
mySet.has(5);              // true
mySet.has(Math.sqrt(25));  // true
mySet.has('Some Text'.toLowerCase()); // true
mySet.has(o); // true

mySet.size; // 5

mySet.delete(5); // Elimina 5 del Set
mySet.has(5);    // false, 5 fue eliminado

mySet.size; // 4, sólo removimos un valor
console.log(mySet);// Set {1, "some text", Object {a: 1, b: 2}, Object {a: 1, b: 2}}

Iterando los Sets

// iterar todos los items de un set
// imprimir en consola los items en orden: 1, 'some text', {a: 1, b: 2}
for (let item of mySet) console.log(item);

// imprimir en consola los items en orden: 1, 'some text', {a: 1, b: 2}
for (let item of mySet.keys()) console.log(item);
 
// imprimir en consola los items en orden: 1, 'some text', {a: 1, b: 2}
for (let item of mySet.values()) console.log(item);

// imprimir en consola los items en orden: 1, 'some text', {a: 1, b: 2}
//(key y value poseen en mismo valor en este caso)
for (let [key, value] of mySet.entries()) console.log(key);

// crear un Array plano con los mismos valores, utilizando Array.from
const myArr = Array.from(mySet); // [1, 'some text', {a: 1, b: 2}]

// también se puede utilizar para guardar elementos del DOM
mySet.add(document.body);
mySet.has(document.querySelector('body')); // true

// crear un Array plano con los mismos valores, utilizando propagación
const mySet2 = new Set([1,2,3,4]);
mySet2.size; // 4
[...mySet2]; // [1,2,3,4]

// la intersección entre dos sets puede ser simulada con
const intersection = new Set([...set1].filter(x => set2.has(x)));

// la diferencia puede ser simulada con
const difference = new Set([...set1].filter(x => !set2.has(x)));

// Iteración utilizando forEach
mySet.forEach((value) => {
  console.log(value);
});

// 1
// 2
// 3
// 4

Implementando operaciones básicas

Set.prototype.isSuperset = function(subset) {
    for (var elem of subset) {
        if (!this.has(elem)) {
            return false;
        }
    }
    return true;
}

Set.prototype.union = function(setB) {
    var union = new Set(this);
    for (var elem of setB) {
        union.add(elem);
    }
    return union;
}

Set.prototype.intersection = function(setB) {
    var intersection = new Set();
    for (var elem of setB) {
        if (this.has(elem)) {
            intersection.add(elem);
        }
    }
    return intersection;
}

Set.prototype.difference = function(setB) {
    var difference = new Set(this);
    for (var elem of setB) {
        difference.delete(elem);
    }
    return difference;
}

//Examples
var setA = new Set([1,2,3,4]),
    setB = new Set([2,3]),
    setC = new Set([3,4,5,6]);

setA.isSuperset(setB); // => true
setA.union(setC); // => Set [1, 2, 3, 4, 5, 6]
setA.intersection(setC); // => Set [3, 4]
setA.difference(setC); // => Set [1, 2]

Relación con los objetos Array

const myArray = ['value1', 'value2', 'value3'];

// Utiliza el constructor para para crear un set con el mismo contenido que un array
const mySet = new Set(myArray);

mySet.has('value1'); // devuelve true

// Utiliza la propagación para crear un array con los contenidos de un set
console.log([...mySet]); // Muestra lo mismo utilizando myArray

Especificaciones

Especificación Estado Comentario
ECMAScript 2015 (6th Edition, ECMA-262)
La definición de 'Set' en esta especificación.
Standard Definición inicial
ECMAScript Latest Draft (ECMA-262)
La definición de 'Set' en esta especificación.
Draft

Compatibilidad de navegadores

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome para AndroidFirefox para AndroidOpera para AndroidSafari en iOSSamsung InternetNode.js
SetChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 13IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 14Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
Soporte completo 0.12
Soporte completo 0.10
Deshabilitado
Deshabilitado From version 0.10: this feature is behind the --harmony runtime flag.
addChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 13IE Soporte parcial 11
Notas
Soporte parcial 11
Notas
Notas Returns 'undefined' instead of the 'Set' object.
Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 14Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo Si
clearChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 19IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 19Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
deleteChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 13IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 14Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
Soporte completo 0.12
Soporte completo 0.10
Deshabilitado
Deshabilitado From version 0.10: this feature is behind the --harmony runtime flag.
entriesChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 24IE Sin soporte NoOpera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 24Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
forEachChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 25IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 25Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
hasChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 13IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 14Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo Si
Key equality for -0 and 0Chrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 29IE Sin soporte NoOpera Soporte completo 25Safari Soporte completo 9WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 29Opera Android Soporte completo 25Safari iOS Soporte completo 9Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 4.0.0
prototypeChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 13IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 14Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo Si
new Set(iterable)Chrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 13IE Sin soporte NoOpera Soporte completo 25Safari Soporte completo 9WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 14Opera Android Soporte completo 25Safari iOS Soporte completo 9Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
new Set(null)Chrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 37IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 9WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 37Opera Android Soporte completo 25Safari iOS Soporte completo 9Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
Soporte completo 0.12
Soporte completo 0.10
Deshabilitado
Deshabilitado From version 0.10: this feature is behind the --harmony runtime flag.
Set() without new throwsChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 42IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 9WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 42Opera Android Soporte completo 25Safari iOS Soporte completo 9Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
sizeChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 19
Notas
Soporte completo 19
Notas
Notas From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
IE Soporte completo 11Opera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 19
Notas
Soporte completo 19
Notas
Notas From Firefox 13 to Firefox 18, the size property was implemented as a Set.prototype.size() method, this has been changed to a property in later versions conform to the ECMAScript 2015 specification.
Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
valuesChrome Soporte completo 38Edge Soporte completo 12Firefox Soporte completo 24IE Sin soporte NoOpera Soporte completo 25Safari Soporte completo 8WebView Android Soporte completo 38Chrome Android Soporte completo 38Firefox Android Soporte completo 24Opera Android Soporte completo 25Safari iOS Soporte completo 8Samsung Internet Android Soporte completo 3.0nodejs Soporte completo 0.12
@@iteratorChrome Soporte completo 43Edge Soporte completo 12Firefox Soporte completo 36
Soporte completo 36
Sin soporte 27 — 36
Notas Nombre alternativo
Notas A placeholder property named @@iterator is used.
Nombre alternativo Usa un nombre no estandar : @@iterator
Sin soporte 17 — 27
Notas Nombre alternativo
Notas A placeholder property named iterator is used.
Nombre alternativo Usa un nombre no estandar : iterator
IE Sin soporte NoOpera Soporte completo 30Safari Soporte completo SiWebView Android Soporte completo 43Chrome Android Soporte completo 43Firefox Android Soporte completo 36
Soporte completo 36
Sin soporte 27 — 36
Notas Nombre alternativo
Notas A placeholder property named @@iterator is used.
Nombre alternativo Usa un nombre no estandar : @@iterator
Sin soporte 17 — 27
Notas Nombre alternativo
Notas A placeholder property named iterator is used.
Nombre alternativo Usa un nombre no estandar : iterator
Opera Android Soporte completo 30Safari iOS Soporte completo SiSamsung Internet Android Soporte completo 4.0nodejs Soporte completo 0.12
@@speciesChrome Soporte completo 51Edge Soporte completo 13Firefox Soporte completo 41IE Sin soporte NoOpera Soporte completo 38Safari Soporte completo 10WebView Android Soporte completo 51Chrome Android Soporte completo 51Firefox Android Soporte completo 41Opera Android Soporte completo 41Safari iOS Soporte completo 10Samsung Internet Android Soporte completo 5.0nodejs Soporte completo 6.5.0
Soporte completo 6.5.0
Soporte completo 6.0.0
Deshabilitado
Deshabilitado From version 6.0.0: this feature is behind the --harmony runtime flag.

Leyenda

Soporte completo  
Soporte completo
Soporte parcial  
Soporte parcial
Sin soporte  
Sin soporte
Ver notas de implementación.
Ver notas de implementación.
El usuario debe de habilitar explícitamente esta característica.
El usuario debe de habilitar explícitamente esta característica.
Usa un nombre no estandar.
Usa un nombre no estandar.

Ver también