como-usar-set-en-javascript

El tipo Set en JavaScript

Los Sets en JavaScript son estructuras de datos que permiten almacenar colecciones de valores únicos.

Esta característica los hace útiles cuando necesitamos garantizar la unicidad de los elementos (por ejemplo, para eliminar duplicados de un array).

Los Sets pueden almacenar cualquier tipo de dato, incluyendo primitivos como números y cadenas, así como objetos.

Sus características principales son,

  • Valores únicos: No permite duplicados. Si intentas añadir un elemento que ya existe, simplemente será ignorado.
  • Tipos de datos: Puedes almacenar cualquier tipo de valor, incluidos objetos y otros Sets.
  • Orden de inserción: Los Set mantienen el orden de inserción de los valores.

Si quieres aprender más sobre Sets (también llamados HashSet)
consulta el Curso de Estructuras de Datos leer más ⯈

Creación de un Set

Para crear un Set, utilizamos el constructor Set():

const miSet = new Set();
console.log(miSet); // Set(0) {}

También podemos inicializar un Set pasando un Array (u otro iterable) como argumento al constructor:

const numeros = new Set([1, 2, 3, 4, 5]);
console.log(numeros); // Set(5) {1, 2, 3, 4, 5}

Si un iterable contiene valores duplicados, el Set automáticamente los elimina:

const duplicados = new Set([1, 2, 2, 3, 4, 4]);
console.log(duplicados); // Set(4) {1, 2, 3, 4}

Operaciones básicas

Añadir elementos

Para agregar elementos a un Set, utilizamos el método .add(). Si intentamos agregar un elemento que ya existe, no se generará un error, pero el Set ignorará el intento.

const mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(1); // Ignorado

console.log(mySet); // Output: Set { 1, 2 }

Verificar existencia de elementos

Para comprobar si un elemento está presente en un Set, utilizamos el método .has(), que devuelve un valor booleano:

console.log(mySet.has(1)); // Output: true
console.log(mySet.has(3)); // Output: false

Eliminar elementos

Podemos eliminar elementos de un Set utilizando el método .delete(). Si el elemento no existe, el método no generará error, simplemente no hará nada.

mySet.delete(2);
console.log(mySet); // Output: Set { 1 }

Vaciar el Set

Si queremos eliminar todos los elementos de un Set, podemos utilizar el método .clear():

mySet.clear();
console.log(mySet); // Output: Set {}

Obtener el tamaño del Set

La propiedad .size devuelve el número de elementos en el Set:

const numeros = new Set([1, 2, 3]);
console.log(numeros.size); // 3

No se puede acceder por índice

A diferencia de los arrays, no podemos acceder a los elementos de un Set mediante un índice. Solo podemos usar métodos de iteración para acceder a sus valores.

Recorrer un Set

Los Sets son iterables, lo que significa que podemos recorrer sus elementos utilizando un bucle for...of, el método .forEach(), o convertirlos a un array.

Con un bucle for...of

const mySet = new Set(['a', 'b', 'c']);

for (const item of mySet) {
    console.log(item); // Output: a, b, c
}

Usando .forEach()

mySet.forEach((value) => {
    console.log(value); // Output: a, b, c
});

Convertir a array

Podemos convertir un Set a un array utilizando el operador de propagación (...) o el método Array.from():

const arrayFromSet = [...mySet]; // Con operador de propagación
const anotherArrayFromSet = Array.from(mySet); // Con Array.from()

console.log(arrayFromSet); // Output: [ 'a', 'b', 'c' ]

Combinación de Sets

Unir dos Sets

Aunque no existe un método directo para unir Sets, podemos usar el operador spread:

const set1 = new Set([1, 2, 3]);
const set2 = new Set([3, 4, 5]);
const union = new Set([...set1, ...set2]);
console.log(union); // Set(5) {1, 2, 3, 4, 5}

Intersección de Sets

La intersección de dos Sets consiste en los elementos que están en ambos:

const interseccion = new Set([...set1].filter((x) => set2.has(x)));
console.log(interseccion); // Set(1) {3}

Diferencia de Sets

La diferencia entre dos Sets consiste en los elementos que están en uno pero no en el otro:

const diferencia = new Set([...set1].filter((x) => !set2.has(x)));
console.log(diferencia); // Set(2) {1, 2}

Ejemplos prácticos