43. Implementación básica de conjuntos en JavaScript

JavaScript incluye la estructura Set para almacenar valores únicos y aplicar ideas de teoría de conjuntos en programas reales.

43.1 Introducción

Después de estudiar conjuntos desde el punto de vista matemático, es importante ver cómo llevar esas ideas a código. JavaScript ofrece la estructura Set, diseñada para guardar valores únicos.

Con Set se pueden representar colecciones sin repetidos, consultar pertenencia, recorrer elementos y construir operaciones como unión, intersección y diferencia.

43.2 Crear un conjunto

Un conjunto se crea con new Set(). Se pueden agregar elementos al declararlo o después de crearlo.

const lenguajes = new Set(["JavaScript", "SQL", "HTML"]);

console.log(lenguajes);

El conjunto contiene cada valor una sola vez.

43.3 Evitar duplicados

Si se intenta agregar un valor que ya existe, el conjunto no lo repite.

const numeros = new Set([1, 2, 2, 3, 3, 3]);

console.log(numeros); // Set { 1, 2, 3 }

Esta propiedad coincide con la idea matemática de que un conjunto no depende de la repetición de sus elementos.

43.4 Agregar elementos

El método add incorpora un nuevo elemento al conjunto.

const permisos = new Set();

permisos.add("leer");
permisos.add("escribir");
permisos.add("leer");

console.log(permisos); // Set { "leer", "escribir" }

Agregar el mismo elemento más de una vez no cambia el conjunto.

43.5 Pertenencia

Para comprobar si un elemento pertenece a un conjunto se usa has.

const roles = new Set(["admin", "editor", "lector"]);

console.log(roles.has("admin")); // true
console.log(roles.has("invitado")); // false

Esta operación representa la pregunta matemática x ∈ A.

43.6 Eliminar elementos

El método delete quita un elemento del conjunto si existe.

const activos = new Set(["Ana", "Luis", "Sofía"]);

activos.delete("Luis");

console.log(activos); // Set { "Ana", "Sofía" }

Eliminar un elemento se relaciona con construir un conjunto sin ese valor.

43.7 Cardinalidad

La propiedad size indica la cantidad de elementos del conjunto.

const categorias = new Set(["web", "datos", "seguridad"]);

console.log(categorias.size); // 3

En términos matemáticos, size representa la cardinalidad del conjunto.

43.8 Recorrer un conjunto

Un conjunto puede recorrerse con for...of.

const etiquetas = new Set(["urgente", "pendiente", "revisado"]);

for (const etiqueta of etiquetas) {
  console.log(etiqueta);
}

El recorrido visita cada elemento una sola vez.

43.9 Convertir arreglo a conjunto

Una aplicación frecuente de Set es eliminar duplicados de un arreglo.

const ids = [10, 20, 10, 30, 20, 40];
const idsUnicos = new Set(ids);

console.log(idsUnicos); // Set { 10, 20, 30, 40 }

El arreglo original puede tener repeticiones, pero el conjunto resultante conserva solo valores únicos.

43.10 Convertir conjunto a arreglo

Para obtener un arreglo desde un conjunto se puede usar el operador de propagación.

const codigos = new Set(["A1", "B2", "C3"]);
const lista = [...codigos];

console.log(lista); // ["A1", "B2", "C3"]

Esto es útil cuando se necesita ordenar, mapear o mostrar los datos en una interfaz.

43.11 Unión

La unión de dos conjuntos contiene los elementos que están en uno, en el otro o en ambos.

function union(a, b) {
  return new Set([...a, ...b]);
}

const A = new Set([1, 2, 3]);
const B = new Set([3, 4, 5]);

console.log(union(A, B)); // Set { 1, 2, 3, 4, 5 }

Esta función implementa A ∪ B.

43.12 Intersección

La intersección contiene los elementos comunes a ambos conjuntos.

const A = new Set([1, 2, 3]);
const B = new Set([3, 4, 5]);

function interseccion(a, b) {
  return new Set([...a].filter(x => b.has(x)));
}

console.log(interseccion(A, B)); // Set { 3 }

Esta función implementa A ∩ B.

43.13 Diferencia

La diferencia contiene los elementos que están en el primer conjunto y no están en el segundo.

const A = new Set([1, 2, 3]);
const B = new Set([3, 4, 5]);

function diferencia(a, b) {
  return new Set([...a].filter(x => !b.has(x)));
}

console.log(diferencia(A, B)); // Set { 1, 2 }

Esta función implementa A - B.

43.14 Diferencia simétrica

La diferencia simétrica contiene los elementos que pertenecen a uno solo de los conjuntos.

const A = new Set([1, 2, 3]);
const B = new Set([3, 4, 5]);

function diferenciaSimetrica(a, b) {
  const soloA = [...a].filter(x => !b.has(x));
  const soloB = [...b].filter(x => !a.has(x));

  return new Set([...soloA, ...soloB]);
}

console.log(diferenciaSimetrica(A, B)); // Set { 1, 2, 4, 5 }

Esta operación elimina los elementos compartidos.

43.15 Subconjunto

Un conjunto es subconjunto de otro si todos sus elementos pertenecen al segundo conjunto.

const A = new Set([1, 2, 3]);
const C = new Set([1, 2]);

function esSubconjunto(a, b) {
  return [...a].every(x => b.has(x));
}

console.log(esSubconjunto(C, A)); // true

Esta función implementa la relación C ⊆ A.

43.16 Igualdad de conjuntos

Dos conjuntos son iguales si tienen la misma cardinalidad y cada elemento de uno pertenece al otro.

function sonIguales(a, b) {
  return a.size === b.size && [...a].every(x => b.has(x));
}

console.log(sonIguales(new Set([1, 2]), new Set([2, 1]))); // true

El orden de inserción no cambia la igualdad matemática del conjunto.

43.17 Limpiar un conjunto

El método clear elimina todos los elementos.

const seleccionados = new Set(["tema1", "tema2"]);

seleccionados.clear();

console.log(seleccionados.size); // 0

Después de limpiar el conjunto, queda vacío.

43.18 Uso práctico: permisos de usuario

Los conjuntos son útiles para controlar permisos sin repetir valores.

function esSubconjunto(a, b) {
  return [...a].every(x => b.has(x));
}

const permisosUsuario = new Set(["leer", "editar"]);
const permisosRequeridos = new Set(["leer"]);

const puedeAcceder = esSubconjunto(permisosRequeridos, permisosUsuario);

console.log(puedeAcceder); // true

La validación se resuelve como una comparación entre conjuntos.

43.19 Errores comunes

  • Esperar que un conjunto conserve duplicados.
  • Comparar conjuntos con === cuando se quiere igualdad matemática.
  • Olvidar convertir el conjunto a arreglo antes de usar métodos como map o filter.
  • Confundir pertenencia con posición.

43.20 Conclusión

Set permite implementar de forma directa muchas ideas de teoría de conjuntos en JavaScript. Con esta estructura se pueden representar valores únicos, consultar pertenencia, calcular cardinalidad y construir operaciones fundamentales.

Dominar estas operaciones facilita resolver problemas de validación, filtrado, permisos, etiquetas, datos únicos y comparación de colecciones.