我的高级目标是能够按值而不是通过引用比较特定对象(具有相同类型)。对象中的每个值都是布尔值或数字,速度至关重要。
打破这一点,我正在寻找一个非常快的函数,从这个对象,到字符串或数字(即哈希),以便我可以在哈希表中查找比较。
我很高兴为速度增益提出所有要求 - 它不需要是自动的,也不需要检查任何typeof
例如:
const foo = {
a: true,
b: {
c: 42
}
d: 3
}
可以减少到[1,42,3],然后可以用作对象的查找键,但是将此数组转换为字符串作为哈希键不会起作用,因为&# 39;无法区分[1,4,23]
我已经在hash algorithm for variable size boolean array尝试了这些建议,当我的对象适合32位TypedNumberArray时这很有用 - 但是一旦我需要其中几个数组并在其上调用toString()
,它变慢(但仍然比JSON.stringify快得多)
目标语言是javascript,但我很高兴看到C或其他语言的代码示例,如果有帮助的话。
谢谢!
答案 0 :(得分:1)
这个怎么样?
class Lookup {
constructor() {
this.lookup = {}
}
insert(value) {
if (!(value.a in this.lookup))
this.lookup[value.a] = {}
if (!(value.b.c in this.lookup[value.a]))
this.lookup[value.a][value.b.c] = {}
this.lookup[value.a][value.b.c][value.d] = value
}
}
const l = new Lookup()
const foo = {
a: true,
b: {
c: 42
},
d: 3
}
l.insert(foo)
console.log('l.lookup[true][42][3] =', l.lookup[true][42][3])
输出结果为:
l.lookup[true][42][3] = { a: true, b: { c: 42 }, d: 3 }
答案 1 :(得分:0)
笨蛋,愚蠢的错误!正如@ joseph-silber指出的那样,逗号包含在Array.toString()中,所以这不是问题。
仍然很好奇看到这个问题的其他解决方案:)
答案 2 :(得分:-1)
如果将查找键设置为实际值
var lookup = [true,42,3]
您可以将其用作哈希值:
var values = {}
values[lookup] = foo