В JavaScript все объекты действуют как хэш-карты. Однако ключи к этим хэш-картам должны быть строками. Если это не так, они преобразуются с toString()
. Это означает, что:Есть ли библиотека hashmap для JavaScript?
var a = {foo: 1};
var b = {bar: 2};
var o = {};
o[a] = 100;
o[b]; // 100
JSON.stringify(o); // '{"[object Object]":100}'
То есть, так как toString()
любого простого объект является [object Object]
, все они относятся к тому же значению.
Я хотел бы создать хэш-карту, где объекты с одинаковыми свойствами и значениями обращаются к одному и тому же значению, но объекты с разными свойствами или значениями адресуют разные значения. То есть:
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
Мой первый инстинкт должен был использовать JSON.stringify()
превратить объекты в строки, но:
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}'
То есть, JSON сериализации зависящих от порядка.
Есть ли хорошая библиотека или техника для реализации хэш-карты?
Update:
Эквивалентного, есть хорошая функция хеширования, что:
hash({foo: 1, bar: 2}) == hash({bar: 2, foo: 1})
Да, это требует некоторой работы, чтобы быть перфомантной и пуленепробиваемой, но я думаю, что у вас есть правильная идея. – Peeja
@Peeja: Я не уверен, что это может быть выполнено, несмотря на то, что оно соответствует вашим требованиям. Хотя, в зависимости от ваших точных потребностей, возможно, это может быть сделано достаточно хорошо. – LukeH