【发布时间】:2019-09-28 13:21:14
【问题描述】:
这里有多个与我的问题类似的问题,但没有一个真正完整地回答它。
基本上,我希望将对象作为 JavaScript 中的键。我知道Map 是可能的,但是它并不完全适用于我的用例。原因如下:
假设我有两个对象,var d1 = {a: 1, b: 2} 和 var d2 = {a: 1, b: 2},还有一个 Map var m = new Map()。将d1 添加到m 时,当我调用m.get(d2) 时,我会得到未定义。我认为这是因为Map 以类似引用的方式工作。
但是,我想要以下功能:
m.set(d1, 'hit');
m.get(d2) // should return 'hit' because properties and values of d1 = d2
我想到的一种方法是不使用Map,而是使用一个简单的JS对象。键是JSON.stringify(obj),当我想从对象中获取值时,我使用JSON.parse(key),然后执行对象相等检查(Object.getOwnPropertyNames,然后逐一检查)。
但是,我觉得这种方法比应有的方式更加复杂和耗时。我正在寻找的可能是某种哈希函数,它可以有效地将具有String 类型的键的对象映射到Number 类型的值(在我的情况下为整数)。此外,排序可以不同(d1 = {a: 1, b: 2}应该等于d2 = {b: 2, a: 1})。
如何设计一个高效的散列函数与 JS Objects/Maps 一起执行上述操作?
【问题讨论】:
-
对象总是有相同的键吗?
-
如果使用哈希函数,则必须实现自己的哈希表,而不是将其用作映射中的键,因为可能存在哈希冲突。
-
对象并不总是具有相同的键。其中有些只能包含 2 个属性,有些可能有 30 个。而且它们可以不同。
标签: javascript dictionary hash-function