首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >典雅回忆录

典雅回忆录
EN

Code Review用户
提问于 2013-02-01 17:57:00
回答 3查看 1.4K关注 0票数 7

我想要一种优雅的方式来实现回忆录。以下是我想出的:

代码语言:javascript
复制
function memoize(fn) {
    var cache = new WeakMap();
    return function() {
        if (!cache[arguments]) {
            cache[arguments] = fn.call(this, arguments);
        }
        return cache[arguments];
    }
}

它很不错,但是WeakMap没有得到很好的支持。有没有更好、更干净的方法来做这件事?

EN

回答 3

Code Review用户

发布于 2015-11-19 11:16:57

我用这个

代码语言:javascript
复制
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):

代码语言:javascript
复制
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;
    }, {})
);

因为状态是不变的,所以它不会改变。改变状态的唯一方法是创建一个新的状态。所以每当事情发生变化,我们就会有一个新的状态。这是一个非常好的缓存密钥!

票数 4
EN

Code Review用户

发布于 2017-06-08 19:52:59

在这里您可以找到多个参数的WeakMap解决方案:https://github.com/Dans-labs/dariah/blob/master/client/src/js/lib/utils.js中的回忆录

对于函数处理大型、不可变对象的情况,stringify是无用的(它不能提高性能)。那么WeakMap就是您的朋友,因为您可以使用对象本身作为键,而不必阻止它们被垃圾收集。但是您需要一个技巧来为多个参数生成一个键。上面的链接指向解决方案。

票数 1
EN

Code Review用户

发布于 2013-02-01 18:01:26

我只是在想这个:

代码语言:javascript
复制
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];
    }
}

这是非常跨浏览器的。我想不出有哪个浏览器不支持这个。

但感觉确实很难看。不过,这还是我能想到的最好的。

票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/21192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档