摘要: 除了使用 JSON.stringify
,是否有更快的哈希对象的方法?
详情: 我有一个Ruby和JavaScript库(NeatJSON),它提供了JavaScript值的漂亮打印。最近,我修复了一个问题,深度嵌套的对象导致 O(n!) 性能问题(n 是嵌套级别),使用基于被序列化的对象和缩进量的备忘录。
在Ruby中,修复非常容易,因为您可以通过独特对象集合的数组索引散列表:
build = ->(object,indent) do
memoizer[[object,indent]] ||= <all the rest of the code>
end
然而,在JavaScript中,我无法通过另一个对象(以独特的方式)对对象进行索引。在多篇在线文章的指导下,我决定使用JSON.stringify
在函数的所有参数上创建一个唯一的键来进行通用修复问题:
function memoize(f){
var memo = {};
var slice = Array.prototype.slice;
return function(){
var args = slice.call(arguments);
var mkey = JSON.stringify(args);
if (!(mkey in memo)) memo[mkey] = f.apply(this,args);
return memo[mkey];
}
}
function rawBuild(o,indent){ .. }
var build = memoize(rawBuild);
这种方法可行,但 (a) 比我想要的稍微慢一些,而且 (b) 执行(天真)序列化每个对象和值似乎非常低效(和不优雅)。对具有许多值的大型对象进行序列化,将为整个对象中的每个唯一值(而不仅仅是叶子值)存储字符串和格式化结果。
是否有现代 JavaScript 技巧可以让我唯一地标识一个值?例如,某种访问内部 ID 或以 O(1) 时间找到值的唯一整数的方式来关联复杂对象?
var a = {b:1}; var c = memoizedFn(a); a.b = 2; var d = memoizedFn(a);
第二次调用应该使用记忆化的值吗? - Tamas Hegedus