【发布时间】:2019-04-16 15:40:27
【问题描述】:
我正在尝试使用 JavaScript 实现多个值的记忆模式。 我设法编写了单个值的代码:
var lazy = {};
lazy.memoization = evaluator => {
const cache = new Map;
return key => {
cache.has(key) || cache.set(key, evaluator(key));
return cache.get(key);
};
};
var memoize = lazy.memoization(key => console.log('computing ', key));
memoize(1); // -> computing 1
memoize(2); // -> computing 2
这里是多个键的版本,它没有按预期工作,它只是输出'computing Array []','computing undefined':
var lazy = {};
lazy.memoization = evaluator => {
const cash = new Map;
return (...keys) => {
var values = [];
keys.reduce((v, f) => {
if (!cash.has(v)) {
cash.set(v, evaluator(v));
}
values.push(cash.get(v));
}, values);
return values;
};
};
var memoizeMultiple = lazy.memoization((...keys) => {
keys.forEach(key => console.log('computing ', key))
});
memoizeMultiple(1, 2);
这里有什么问题?
【问题讨论】:
-
您正在为传入的每个参数运行
evaluator。这是有意还是应该缓存使用所有参数调用evaluator的结果? -
更重要的是,您提到“它没有按预期工作”,但不要告诉我们您的期望:)。
-
reduce调用存在几个问题:您使用v好像它是密钥,但密钥是f;你没有从回调中返回任何东西,所以在随后的旅行中v是undefined;你没有使用返回值(这几乎总是意味着你不应该使用reduce)。 -
在单独的注释中,
cache是存储在内存中的正确术语(在这种情况下)。 “现金”是指金钱。 -
@VLAZ 是的,你说得对,感谢您对“现金”的评论。