首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当回忆录接受函数时,Lodash回忆录键?

当回忆录接受函数时,Lodash回忆录键?
EN

Stack Overflow用户
提问于 2018-03-12 21:31:16
回答 1查看 1.5K关注 0票数 1

我有一个大型的数据收集,我经常通过首先对它应用一个过滤器来查询。我想缓存和重用我使用的不同过滤器函数的结果,因为这部分可能很昂贵。下面是一个粗略的模拟:

代码语言:javascript
复制
const a = x => x + 1;
const b = x => x + 2;

const m = _.memoize( 
  f => (console.log('filtering data'), f(314159)),
  f => String(f)
 );

console.log(m(a));
console.log(m(b));
console.log(m(a));
console.log(m(b));

这里,"a“和"b”是我想要使用的筛选函数,"m“每次都对相同的数据起作用。

如何指定_.memoize函数的键?

上面的方法是可行的,但我使用的是函数的字符串表示,这感觉是错误的。有更好的办法吗?

我担心这是不安全的,当应用小型化。在我的实际代码中,"memoize“部分位于一个ES6模块中,"a”和"b“部分位于另一个模块中,对"m”的调用位于导入"a“和"b”函数的几个不同模块中。这样的跨模块的字符串表示是否是稳定的?转换到字符串表示的速度快吗?

我能想到的唯一选择是创建一个字符串->函数字典,这样您就可以执行像m("a")这样的调用,但是如果名称错误,JavaScript指针就不会选择。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-12 23:22:26

上面的方法是可行的,但我使用的是函数的字符串表示,这感觉是错误的。

确实如此。

我担心这是不安全的,当应用小型化。

不,缩小不是问题所在。不同的函数被缩小为不同的代码。

问题是闭包:

代码语言:javascript
复制
const addTo = x => y => x + y
const a = addTo(1),
      b = addTo(2);
console.log(String(a) === String(b));

您只能通过函数的对象标识来可靠地比较它们。最好的方法可能是更新Lodash以使用不需要任何字符串化的ES6 WeakMap

只要不能使用,您就可以使用

代码语言:javascript
复制
const id = Symbol("function identity");
let count = 0;
function toMemoizeKey(fn) {
    return fn[id] || (fn[id] = ++count);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49244709

复制
相关文章

相似问题

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