En JavaScript, todos los objetos actúan de forma parecida a los hashmaps. Sin embargo, las claves para estos hashmaps deben ser cadenas. Si no lo son, se convierten con toString()
. Eso significa:¿Hay una biblioteca de hashmap para JavaScript?
var a = {foo: 1};
var b = {bar: 2};
var o = {};
o[a] = 100;
o[b]; // 100
JSON.stringify(o); // '{"[object Object]":100}'
que es, ya que el toString()
de cualquier objeto normal es [object Object]
, todos ellos abordan el mismo valor.
Me gustaría crear un hashmap donde los objetos con las mismas propiedades y valores aborden el mismo valor, pero los objetos con diferentes propiedades o valores abordan valores diferentes. Es decir:
var a = {foo: 1};
var b = {bar: 2, baz: 3};
var c = {baz: 3, bar: 2};
var hash = new Hash();
hash.set(a, 100);
hash.get(b); // undefined
hash.set(b, 200);
hash.get(b); // 200
hash.get(c); // 200
Mi primer instinto fue utilizar JSON.stringify()
para convertir objetos en cadenas, pero:
var hash = {};
var b = {bar: 2, baz: 3};
var c = {baz: 3, bar: 2};
hash[JSON.stringify(b)] = 100
hash[JSON.stringify(b)] // 100
hash[JSON.stringify(c)] // undefined
JSON.stringify(b) // '{"bar":2,"baz":3}'
JSON.stringify(c) // '{"baz":3,"bar":2}'
Es decir, la serialización JSON depende del orden.
¿Existe una buena biblioteca o técnica para implementar un hashmap como este?
actualización:
De manera equivalente, es que hay una buena función hash tal que:
hash({foo: 1, bar: 2}) == hash({bar: 2, foo: 1})
Sí, necesita un poco de trabajo para ser perfecto ya prueba de balas, pero creo que tienes la idea correcta. – Peeja
@Peeja: No estoy seguro de que se pueda realizar sin dejar de cumplir con sus requisitos. Aunque, dependiendo de tus necesidades exactas, entonces quizás se pueda hacer lo suficientemente bueno. – LukeH