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



从返回哪些数据的角度来看,调用map方法的方法有什么不同吗?

我希望当我做时

_(object).map(callback);

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

而不是使用

_.map(obj, callback)

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

这取决于情况。如果您从未计划在map()之前的之后链接任何函数调用,那么包装该值是没有意义的。另一方面,结构化链可以应用性地转换集合,从而产生紧凑且可读的代码。

根据应用程序的结构,包装器实例可以从一个函数传递到另一个函数,并在此基础上构建。这之所以有效,是因为它们很懒惰,因为在调用value()之前,链式调用实际上不会运行。

从评估的角度来看,他们也很懒惰。这里有一个关于lodash中懒惰评估的好资源。

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

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

大多数人发现这种连锁语法:

_(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版开始),使用链接语法有潜在的性能优势,因为它使用了延迟求值。这意味着它将尽可能多地推迟评估,以最大限度地减少计算结果所需的操作,并减少创建的临时数组的数量。

Adam Boduch链接的关于懒惰评估的文章似乎是一个很好的资源,或者你可以阅读lazy.js的概述,在lodash支持懒惰评估之前,它本质上是lodash/underline的懒惰评估版本。尽管这个已经过时了,但它并没有反映出lodash自编写以来就添加了懒惰的评估。

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

最新更新