tablas - llamar javascript desde html
Formas de crear un conjunto en JavaScript? (7)
En Eloquent JavaScript, Capítulo 4, se crea un conjunto de valores creando un objeto y almacenando los valores como nombres de propiedad, asignando valores arbitrarios (por ejemplo, verdadero) como valores de propiedad. Para verificar si el valor ya está contenido en el conjunto, se usa el operador in
:
var set = {};
if (!''Tom'' in set) {
set.Tom = true;
}
¿Es este idiomático JavaScript? ¿No usaría una matriz aún mejor?
var set = [];
if (!''Tom'' in set) {
set.push = ''Tom'';
}
Hay dos problemas con el uso de objetos JavaScript vacíos para emular conjuntos: primero, un objeto puede tener una propiedad heredada que podría atornillar el operador "in" y segundo, solo puede almacenar valores escalares de esta manera, haciendo que un conjunto de objetos no sea posible. Por lo tanto, una implementación realista de Conjuntos debería proporcionar métodos para add
y contains
lugar de simples y asignaciones de propiedades.
La primera forma es JavaScript idiomático.
Siempre que desee almacenar un par clave / valor, debe usar un objeto JavaScript. En cuanto a las matrices, hay varios problemas:
El índice es un valor numérico.
No es una forma fácil de verificar si un valor está en una matriz sin pasar por el bucle.
Un conjunto no permite duplicados. Una matriz lo hace.
Los conjuntos no permiten entradas duplicadas y normalmente no garantizan un orden predefinido. Las matrices hacen ambas cosas, violando así lo que significa ser un conjunto (a menos que haga controles adicionales).
Puede probar Buckets , es una biblioteca de estructura de datos de JavaScript y tiene todo lo que necesita para manipular conjuntos.
Si desea crear un conjunto a partir de una matriz, simplemente haga lo siguiente:
let arr = [1, 1, 2, 1, 3];
let mySet = new Set(arr); // Set { 1, 2, 3 }
Esta es una sintaxis de azúcar que me gustaba bastante cuando programé en Python, así que me alegro de que ES6 finalmente haya hecho lo mismo.
NOTA: entonces me doy cuenta de que lo que dije no respondió directamente a su pregunta. La razón por la que tiene este "truco" en ES5 es porque el tiempo de búsqueda en un objeto por claves es significativamente más rápido (O (1)) que en una matriz (O (n)). En aplicaciones de rendimiento crítico, puede sacrificar este poco de legibilidad o intuición para un mejor rendimiento.
Pero bueno, bienvenidos al 2017, ¡donde puedes usar el Set apropiado en todos los navegadores modernos más importantes ahora!
Yo uso objetos dict como conjuntos. Esto funciona con cadenas y números, pero supongo que causaría problemas si quisiera tener un conjunto de objetos usando operadores personalizados de igualdad y comparación:
Creando un conjunto:
var example_set =
{
''a'':true,
''b'':true,
''c'':true
}
Prueba de inclusión en un conjunto
if( example_set[''a''] ){
alert(''"a" is in set'');
}
Agregar un elemento a un conjunto
example_set[''d''] = true;
Eliminar un elemento de un conjunto
delete example_set[''a'']
;
Sets 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 establecida que funciona para valores arbitrarios, es rápida y maneja NaN correctamente. - Axel Rauschmayer , explorando ES6
Los dos primeros ejemplos del libro de Axel Rauschmayer Explorando ES6 :
Gestionar 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
Verificaría Explorando ES6 si quieres saber más sobre Conjuntos en JavaScript. El libro es gratis para leer en línea, pero si desea apoyar al autor, el Dr. Axel Rauschmayer , puede comprar el libro por alrededor de $ 30.
Si desea usar Sets y ES6 ahora, puede usar Babel , el transpondedor ES6 a ES5 y sus polyfills.
Editar: a partir del 6 de junio de 2017, la mayoría de los principales navegadores cuentan con la compatibilidad completa de Set en sus últimas versiones. Esto significa que es posible que no necesite babel si no le interesa admitir navegadores más antiguos. Si desea ver la compatibilidad en diferentes navegadores, incluido su navegador actual, consulte la tabla de compatibilidad ES6 de Kangax .