我有一个大型的数据收集,我经常通过首先对它应用一个过滤器来查询。我想缓存和重用我使用的不同过滤器函数的结果,因为这部分可能很昂贵。下面是一个粗略的模拟:
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指针就不会选择。
发布于 2018-03-12 23:22:26
上面的方法是可行的,但我使用的是函数的字符串表示,这感觉是错误的。
确实如此。
我担心这是不安全的,当应用小型化。
不,缩小不是问题所在。不同的函数被缩小为不同的代码。
问题是闭包:
const addTo = x => y => x + y
const a = addTo(1),
b = addTo(2);
console.log(String(a) === String(b));您只能通过函数的对象标识来可靠地比较它们。最好的方法可能是更新Lodash以使用不需要任何字符串化的ES6 WeakMap。
只要不能使用,您就可以使用
const id = Symbol("function identity");
let count = 0;
function toMemoizeKey(fn) {
return fn[id] || (fn[id] = ++count);
}https://stackoverflow.com/questions/49244709
复制相似问题