Buscar..


Introducción

El objeto Set le permite almacenar valores únicos de cualquier tipo, ya sean valores primitivos o referencias de objetos.

Los objetos establecidos son colecciones de valores. Puede iterar a través de los elementos de un conjunto en orden de inserción. Un valor en el Conjunto solo puede ocurrir UNA VEZ ; Es único en la colección del Set. Los valores distintos se discriminan utilizando el algoritmo de comparación SameValueZero .

Especificación estándar sobre el conjunto

Sintaxis

  • nuevo conjunto ([iterable])
  • mySet.add (valor)
  • mySet.clear ()
  • mySet.delete (valor)
  • mySet.entries ()
  • mySet.forEach (devolución de llamada [, thisArg])
  • mySet.has (valor)
  • mySet.values ​​()

Parámetros

Parámetro Detalles
iterable Si se pasa un objeto iterable, todos sus elementos se agregarán al nuevo Conjunto. null se trata como indefinido
valor El valor del elemento a agregar al objeto Set.
llamar de vuelta Función a ejecutar para cada elemento.
esteArg Opcional. Valor para utilizar como este al ejecutar la devolución de llamada.

Observaciones

Debido a que cada valor en el Conjunto tiene que ser único, la igualdad de valores se verificará y no se basará en el mismo algoritmo que el utilizado en el operador ===. Específicamente, para los Conjuntos, +0 (que es estrictamente igual a -0) y -0 son valores diferentes. Sin embargo, esto ha sido modificado en la última especificación de ECMAScript 6. Comenzando con Gecko 29.0 (Firefox 29 / Thunderbird 29 / SeaMonkey 2.26) (error 952870) y un Chrome nocturno reciente, +0 y -0 se tratan como el mismo valor en los objetos Set. Además, NaN y undefined también pueden almacenarse en un Set. NaN se considera lo mismo que NaN (aunque NaN! == NaN).

Creando un Set

El objeto Set le permite almacenar valores únicos de cualquier tipo, ya sean valores primitivos o referencias de objetos.

Puede insertar elementos en un conjunto e iterarlos de manera similar a una matriz de JavaScript simple, pero a diferencia de la matriz, no puede agregar un valor a un Conjunto si el valor ya existe en él.

Para crear un nuevo conjunto:

const mySet = new Set();

O puede crear un conjunto a partir de cualquier objeto iterable para darle valores iniciales:

const arr = [1,2,3,4,4,5];
const mySet = new Set(arr);

En el ejemplo anterior, el contenido del conjunto sería {1, 2, 3, 4, 5} . Tenga en cuenta que el valor 4 aparece solo una vez, a diferencia de la matriz original utilizada para crearlo.

Añadiendo un valor a un conjunto

Para agregar un valor a un conjunto, use el método .add() :

mySet.add(5);

Si el valor ya existe en el conjunto, no se agregará nuevamente, ya que los Conjuntos contienen valores únicos.

Tenga en cuenta que el método .add() devuelve el conjunto, por lo que puede encadenar las llamadas de adición:

mySet.add(1).add(2).add(3);

Eliminando valor de un conjunto

Para eliminar un valor de un conjunto, use el método .delete() :

mySet.delete(some_val);

Esta función devolverá true si el valor existía en el conjunto y fue eliminado, o false caso contrario.

Comprobando si existe un valor en un conjunto

Para verificar si un valor dado existe en un conjunto, use el método .has() :

mySet.has(someVal);

someVal true si aparece someVal en el conjunto, de lo contrario, false .

Limpiando un Set

Puede eliminar todos los elementos de un conjunto utilizando el método .clear() :

mySet.clear();

Conseguir la longitud establecida

Puede obtener el número de elementos dentro del conjunto utilizando la propiedad .size

const mySet = new Set([1, 2, 2, 3]);
mySet.add(4);
mySet.size; // 4

Esta propiedad, a diferencia de Array.prototype.length , es de solo lectura, lo que significa que no puede cambiarla asignándole algo:

mySet.size = 5;
mySet.size; // 4

En modo estricto incluso arroja un error:

TypeError: Cannot set property size of #<Set> which has only a getter

Conversión de conjuntos a matrices

En ocasiones, es posible que necesite convertir un Conjunto en una matriz, por ejemplo, para poder usar los métodos de Array.prototype como .filter() . Para hacerlo, use 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];

Ahora puede filtrar la matriz para que contenga solo números pares y convertirla de nuevo a Establecer con el constructor de conjuntos:

mySet = new Set(myArray.filter(x => x % 2 === 0));

mySet ahora contiene solo números pares:

console.log(mySet); // Set {2, 4}

Intersección y diferencia en conjuntos.

No hay métodos incorporados para la intersección y la diferencia en los Conjuntos, pero aún puede lograrlo pero convirtiéndolos en arreglos, filtrando y volviendo a convertir en Conjuntos:

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}

Conjuntos de iteración

Puede utilizar un bucle for-of simple para iterar un conjunto:

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

for (const value of mySet) {
  console.log(value); // logs 1, 2 and 3
}

Al iterar sobre un conjunto, siempre devolverá los valores en el orden en que se agregaron primero al conjunto. Por ejemplo:

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]

También hay un método .forEach() , similar a Array.prototype.forEach() . Tiene dos parámetros, callback , que se ejecutará para cada elemento, y opcional, thisArg , que se usará this cuando se ejecute la callback .

callback tiene tres argumentos. Los dos primeros argumentos son el elemento actual de Set (para Map.prototype.forEach() coherencia con Array.prototype.forEach() y Map.prototype.forEach() ) y el tercer argumento es el propio Set.

mySet.forEach((value, value2, set) => console.log(value)); // logs 1, 2 and 3


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow