在下划线中使用_(obj).map(回调)和_.map(obj,回调)之间的区别

时间:2015-04-08 13:35:39

标签: javascript underscore.js wrapper lodash chaining

从它将返回哪些数据的角度调用map方法的方法有什么不同?

我希望当我做的时候

_(object).map(callback);

它导致创建新的下划线类实例,返回值是下划线的包装器

而不是使用

_.map(obj, callback)

使用相同的(已创建的)下划线实例并按预期返回纯JavaScript数组

2 个答案:

答案 0 :(得分:0)

这取决于。如果您没有计划在map()之前之后链接任何函数调用,那么包装该值是没有意义的。另一方面,构造applicatively转换集合的链会导致紧凑且可读的代码。

根据应用程序的结构,包装器实例可以从一个函数传递到另一个函数,并构建在其上。这是有效的,因为它们是懒惰的,因为链接的调用实际上并不会被调用{。}}。

从评估的角度来看,他们也很懒惰。这是lodash lazy evaluation上的一个很好的资源。

答案 1 :(得分:0)

在所有情况下,链式语法的结果与非链式系统相同。

大多数情况下,链接语法只是一种更易读的语法,可以同时执行多个操作。

大多数人都会发现这种链式语法:

_(ds)
    .groupBy("group")
    .map(function(group) {
        return _.sample(group, n);
    })
    .flatten()
    .value();

比非链式语法更具可读性:

_.flatten(_.map(_.groupBy(ds), "group", function(group) {
    return _.sample(group, n);
}))

但同样,两者都会给你相同的结果。


但是,在lodash中,(从版本3.0开始) 使用链接语法的潜在性能优势,因为它使用延迟评估。这意味着它将推迟尽可能多的评估,以便最小化计算结果所需的操作,并减少创建的临时数组的数量。

关于lazy evaluation链接的文章Adam Boduch似乎是一个很好的资源,或者你可以阅读overview for Lazy.js,它本质上是lodash / underscore的懒惰评估版本,之后lodash支持懒惰评估本身。虽然那个已经过时了,但是它并没有反映出自编写本文以来懒惰的评价已被添加到lodash中。

Underscore最终可能会最终为他们的链接语法添加惰性评估,但我还没有看到任何迹象表明他们的路线图。