作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
SO 中有多个问题与我的问题类似,但没有一个能真正完全回答。
基本上,我希望将对象作为 JavaScript 中的键。我知道 Map
是可行的,但是,它并不完全适用于我的用例。原因如下:
假设我有两个对象,var d1 = {a: 1, b: 2}
和 var d2 = {a: 1, b: 2}
,和一个 map var m = new Map()
。将 d1
添加到 m
时,当我调用 m.get(d2)
时,我将得到 undefined。我认为这是因为 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 对象/ map 一起执行上述操作?
最佳答案
编写一个函数,将对象转换为具有一致顺序键的字符串。
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)));
关于javascript - JavaScript 中的字符串到整数对象散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58146720/
我是一名优秀的程序员,十分优秀!