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]