Los conjuntos ahora están disponibles en ES2015 (también conocido como ES6, es decir, ECMAScript 6). ES6 ha sido el estándar actual para JavaScript desde junio de 2015.
ECMAScript 6 tiene la estructura de datos Set que funciona para valores arbitrarios, es rápido y maneja NaN correctamente. - Axel Rauschmayer , Explorando ES6
Los primeros dos ejemplos del libro de Axel Rauschmayer Exploring ES6 :
Gestión de elementos individuales:
> let set = new Set();
> set.add('red')
> set.has('red')
true
> set.delete('red')
true
> set.has('red')
false
Determinar el tamaño de un conjunto y borrarlo:
> let set = new Set();
> set.add('red')
> set.add('green')
> set.size
2
> set.clear();
> set.size
0
Me volvería a la salida Explorando ES6 si desea obtener más información acerca de los conjuntos de JavaScript. El libro es de lectura gratuita en línea, pero si desea apoyar al autor, el Dr. Axel Rauschmayer , puede comprarlo por alrededor de $ 30.
Si desea utilizar Sets y ES6 ahora, puede utilizar Babel , el transpilador de ES6 a ES5 y sus polyfills.
Editar: A partir del 6 de junio de 2017, la mayoría de los principales navegadores tienen soporte completo de Set en sus últimas versiones (excepto IE 11). Esto significa que es posible que no necesite babel si no le interesa admitir navegadores antiguos. Si desea ver la compatibilidad en diferentes navegadores, incluido su navegador actual, consulte la tabla de compatibilidad ES6 de Kangax .
EDITAR:
Solo una aclaración sobre la inicialización. Los conjuntos pueden tomar cualquier iterable sincrónico en su constructor. Esto significa que pueden tomar no solo matrices, sino también cadenas e iteradores. Tomemos, por ejemplo, la siguiente inicialización de matriz y cadena de un conjunto:
const set1 = new Set(['a','a','b','b','c','c']);
console.log(...set1);
console.log(set1.size);
const set2 = new Set("aabbcc");
console.log(...set2);
console.log(set2.size);
Ambas salidas de la matriz y la cadena son iguales. Tenga en cuenta que ...set1
es la sintaxis de propagación . Parece que cada elemento del iterable se agrega uno por uno al conjunto, por lo que, dado que tanto la matriz como la cadena tienen los mismos elementos y como los elementos están en el mismo orden, el conjunto se crea igual. Otra cosa a tener en cuenta sobre los conjuntos es que cuando se itera sobre ellos, el orden de iteración sigue el orden en que los elementos se insertaron en el conjunto. A continuación, se muestra un ejemplo de iteración sobre un conjunto:
const set1 = new Set(['a','a','b','b','c','c']);
for(const element of set1) {
console.log(element);
}
Dado que puede usar cualquier iterable para inicializar un conjunto, incluso podría usar un iterador de una función generadora . Aquí hay dos ejemplos de inicializaciones de iteradores que producen el mismo resultado:
function* getLetters1 () {
yield 'a';
yield 'a';
yield 'b';
yield 'b';
yield 'c';
yield 'c';
}
function* getLetters2 (letters, repeatTimes) {
for(const letter of letters) {
for(let i = 0; i < repeatTimes; ++i) {
yield letter;
}
}
}
console.log("------ getLetters1 ------");
console.log(...getLetters1());
const set3 = new Set(getLetters1());
console.log(...set3);
console.log(set3.size);
console.log("------ getLetters2 ------");
console.log(...getLetters2('abc', 2));
const set4 = new Set(getLetters2('abc', 2));
console.log(...set4);
console.log(set4.size);
Las funciones del generador de estos ejemplos podrían simplemente escribirse para que no se repitan, pero si la función del generador es más complicada y siempre que lo siguiente no afecte el rendimiento de manera demasiado negativa, puede usar el método Set para ayudar a obtener solo valores de un generador que no no repetir.
Si desea saber más sobre los sets sin leer el capítulo de su libro del Dr. Rauschmayer, puede consultar los documentos de MDN en Set . MDN también tiene más ejemplos de iterar sobre un conjunto como el uso forEach
y el uso de los .keys
, .values
y .entries
métodos. MDN también tiene ejemplos como unión de conjuntos, intersección de conjuntos, diferencia de conjuntos, diferencia de conjuntos simétricos y comprobación de superconjuntos de conjuntos. Con suerte, la mayoría de esas operaciones estarán disponibles en JavaScript sin necesidad de crear sus propias funciones que las respalden. De hecho, existe esta propuesta TC39 para nuevos métodos Set que, con suerte, deberían agregar los siguientes métodos a Set en JavaScript en algún momento futuro si la propuesta alcanza la etapa 4:
- Set.prototype.intersection (iterable): el método crea una nueva instancia de Set mediante la operación de intersección de set.
- Set.prototype.union (iterable): el método crea una nueva instancia de Set mediante la operación de unión de set.
- Set.prototype.difference (iterable): el método crea un nuevo Set sin elementos presentes en iterable.
- Set.prototype.symmetricDifference (iterable): devuelve el conjunto de elementos que se encuentran solo en this o en iterable.
- Set.prototype.isSubsetOf (iterable)
- Set.prototype.isDisjointFrom (iterable)
- Set.prototype.isSupersetOf (iterable)
'Tom' in set
se vea una matriz para la que es verdadero? Parece que tienes suposiciones erróneas sobre algo y estoy tratando de averiguar qué .