我想要一种优雅的方式来实现回忆录。以下是我想出的:
function memoize(fn) {
var cache = new WeakMap();
return function() {
if (!cache[arguments]) {
cache[arguments] = fn.call(this, arguments);
}
return cache[arguments];
}
}它很不错,但是WeakMap没有得到很好的支持。有没有更好、更干净的方法来做这件事?
发布于 2015-11-19 11:16:57
我用这个
function memoizeFirst(fn) {
const cache = new WeakMap();
return function(arg) {
if (!cache.has(arg)) {
cache.set(arg, fn(arg));
}
return cache.get(arg);
};
}此函数将回传您传递的函数的结果并缓存它。缓存将在第一个参数上发生变化,并且仅在第一个参数上发生变化。如果您计划向它传递多个参数,请不要使用此函数!如果要传递对象作为第一个参数,请使用此函数。
我将此函数用于基于不可变状态构建(临时)索引。示例( groupBy,方法来自IxJS):
const getParentObjectIndex = memoizeFirst(state => state.objectSource && state.objectSource.
where(objectItem => objectItem.parentObject).
groupBy(objectItem => objectItem.parentObject).
reduce(function(map, group) {
map[group.key] = group.
orderBy(item => item.position).
toArray();
return map;
}, {})
);因为状态是不变的,所以它不会改变。改变状态的唯一方法是创建一个新的状态。所以每当事情发生变化,我们就会有一个新的状态。这是一个非常好的缓存密钥!
发布于 2017-06-08 19:52:59
在这里您可以找到多个参数的WeakMap解决方案:https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js中的回忆录
对于函数处理大型、不可变对象的情况,stringify是无用的(它不能提高性能)。那么WeakMap就是您的朋友,因为您可以使用对象本身作为键,而不必阻止它们被垃圾收集。但是您需要一个技巧来为多个参数生成一个键。上面的链接指向解决方案。
发布于 2013-02-01 18:01:26
我只是在想这个:
function memoize(fn) {
var cache = {};
return function() {
var args = Array.prototype.slice.call(arguments).toString();
if (!cache[args]) {
cache[args] = fn.call(this, arguments);
}
return cache[args];
}
}这是非常跨浏览器的。我想不出有哪个浏览器不支持这个。
但感觉确实很难看。不过,这还是我能想到的最好的。
https://codereview.stackexchange.com/questions/21192
复制相似问题