【问题标题】:In lodash.js, will it cache the result for `.value()` method?在 lodash.js 中,它会缓存 `.value()` 方法的结果吗?
【发布时间】:2015-08-03 22:44:37
【问题描述】:

例如,我有这样的代码(coffeescript):

sortedLatLng = _(w)
    .sortBy (x) -> x.time
    .map (x) -> [x.longitude,x.latitude]
    .uniq((x)-> x[0].toFixed(3) + "," + x[1].toFixed(3))   # keep three decimal to merge nearby points
console.log(sortedLatLng.value())
myFunction1(sortedLatLng.value())
myFunction2(sortedLatLng.value())
console.log(sortedLatLng.reverse().value())

这可能会在以后被其他 lodash 方法链接。同时,它的值可能需要被提取。我只是想知道它是否会缓存结果。我没有在它的文档中找到它是如何实现的..

是否会计算一次或两次:

myFunction1(sortedLatLng.value())
myFunction2(sortedLatLng.value())

有人对此有想法吗?

【问题讨论】:

  • 您可以通过严格比较对 .value() 的两次调用来轻松解决这个问题。
  • 我在使用 lodash 库时遇到了 3 次问题。我得到了意想不到的结果,我也想知道lodash 是否正在做一些我没有预料到的缓存。对我来说,我的测试中的所有结果似乎都表明 lodash 生成的对象以某种方式持续/缓存,这对我正在尝试做的事情来说并不方便。

标签: javascript coffeescript underscore.js lazy-evaluation lodash


【解决方案1】:

当您创建 lodash 包装器时,包装后的值存储在包装器中。例如:

var wrapper = _([ 1, 2, 3 ]);

这里,[ 1, 2, 3 ] 存储在wrapper 中,任何添加到包装器的链式操作都会传递此值。链式操作被存储,而不是被执行。例如:

var wrapper = _([ 1, 2, 3 ]).map(function(item) {
    console.log('mapping');
    return item;
});

此代码使用map() 操作创建一个包装器,但不执行它。相反,它存储了链接的操作,以便在调用 value() 时,它可以执行它们:

var wrapper = _([ 1, 2, 3 ]).map(function(item) {
    console.log('mapping');
    return item;
});

wrapper.value()
// mapping
// ...

在此包装器上再次调用 value() 只会对包装后的值重复相同的操作 - 结果不会被缓存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多