w3schools property img attribute javascript jquery hashset

property - ¿Cuál es el equivalente de JavaScript a C#HashSet?



title label html (6)

Bajo el capó, el objeto JavaScript se implementa con una tabla hash. Entonces, tu Key:Value par de Key:Value sería (your integer):true

Una función de búsqueda de tiempo constante podría implementarse como:

var hash = { 1:true, 2:true, 7:true //etc... }; var checkValue = function(value){ return hash[value] === true; }; checkValue(7); // => true checkValue(3); // => false

Tengo una lista de algunos miles de claves enteras. Lo único que tengo que hacer con esta lista es decir si un valor dado está o no en la lista.

Para C # usaría un HashSet para hacer esa búsqueda rápidamente. ¿Cuál es el equivalente de JavaScript?

Nivel de soporte mínimo: IE 9+, jQuery (actual)


En realidad, JavaScript proporciona un objeto Set , bastante simple de usar:

var set = new Set(); set.add(1); set.add(2); set.has(1) // true

Desafortunadamente, no es compatible con IE9.


He leído las soluciones y probé algunas. Después de tratar de usar el método object[key] del object[key] , me di cuenta de que no iba a funcionar. Yo quería un HashSet que pudiera almacenar elementos HTML. Al agregar estos objetos, la key se tradujo a una cadena, así que se me ocurrió mi propio conjunto basado en jQuery. Es compatible con add , remove , contains y clear .

var HashSet = function () { var set = []; this.add = function (obj) { if (!this.contains(obj)) { set.push(obj); } }; this.remove = function (obj) { set = jQuery.grep(set, function (value) { return value !== obj; }); }; this.clear = function () { set = []; }; this.contains = function (obj) { return $.inArray(obj, set) > -1; }; this.isEmpty = function () { return set.length === 0; }; };

Nota
Al agregar algo como $(''#myElement'') al conjunto, se debe agregar el elemento HTML real $(''#myElement'')[0] . Ah ... y si desea mantener una lista de controles modificados, use el nombre del elemento (me dio un problema con :radio controles de :radio ).

Nota 2
Creo que el object[key] podría ser más rápido para tus enteros.

Nota 3
Si solo va a almacenar números o cadenas, este conjunto será más rápido:

var HashSet = function () { var set = {}; this.add = function (key) { set[key] = true; }; this.remove = function (key) { delete set[key]; }; this.clear = function () { set = {}; }; this.contains = function (key) { return set.hasOwnProperty(key); }; this.isEmpty = function () { return jQuery.isEmptyObject(set); }; };


Mapa o si no hay necesidad de iterar WeakMap

let m1=new Map(); m1.set(''isClosed'',false); m1.set(''isInitialized'',false); m1.set(''isClosed'',true); m1.forEach(function(v,k) { console.log(`${k}=${v}`); });


Puede usar solo un objeto JavaScript regular y la palabra clave ''in'' para ver si ese objeto tiene una determinada clave.

var myObj = { name: true, age: true } ''name'' in myObj //returns true; ''height'' in myObj // returns false;

O si sabe que va a tener claves en su objeto que podrían estar integradas en propiedades de objetos JavaScript, use ...

var myObj = { name: true, age: true } myObj.hasOwnProperty(''name'') //returns true; myObj.hasOwnProperty(''height'') // returns false;


Usa un objeto Para agregar una clave al conjunto, hazlo:

object[key] = true;

Para probar si una clave está en el conjunto, hazlo:

if (object.hasOwnProperty(key)) { ... }

Para eliminar una clave del conjunto, hazlo:

delete object[key]