【发布时间】:2011-03-19 14:16:24
【问题描述】:
在 JavaScript 中,所有对象的行为有点像 hashmap。但是,这些哈希映射的键必须是字符串。如果不是,则使用toString() 进行转换。这意味着:
var a = {foo: 1};
var b = {bar: 2};
var o = {};
o[a] = 100;
o[b]; // 100
JSON.stringify(o); // '{"[object Object]":100}'
也就是说,由于任何普通 Object 的 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序列化是顺序依赖的。
有没有好的库或技术来实现这样的哈希图?
更新:
等效地,是否有一个很好的散列函数:
hash({foo: 1, bar: 2}) == hash({bar: 2, foo: 1})
【问题讨论】:
标签: javascript hashmap