【问题标题】:String to Integer Object hashing in JavaScriptJavaScript中的字符串到整数对象散列
【发布时间】: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


【解决方案1】:

编写一个函数,将对象转换为字符串,键的顺序一致。

function objToKey(obj) {
  Object.keys(obj).sort().map(k => `${k}:${obj[k]}`).join(',');
}

var d1 = {a: 1, b: 2},
  d2 = {b: 2, a: 1},
  m = new Map();

m.set(objToKey(d1), "foo");
console.log(m.get(objToKey(d2)));

【讨论】:

  • 是的,这很好,但在我的情况下,键可以是任何东西(a-z、A-Z、String(1)-String(9))
  • 好的,我已经将它概括为一个对键进行排序并将它们包含在结果中的函数。
  • 是的,这行得通。这种方法的时间复杂度我会说相当高。但这会起作用,是的。我会接受你的回答。那么在这种情况下我们需要Map 吗?不过,我只会使用普通的对象。
猜你喜欢
  • 2013-05-07
  • 2010-11-01
  • 1970-01-01
  • 2012-10-11
  • 2018-05-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 2021-08-08
相关资源
最近更新 更多