【问题标题】:What's the difference between transform and reduce in lodashlodash中的transform和reduce有什么区别
【发布时间】:2014-02-27 11:40:06
【问题描述】:

除了说“转换是减少的更强大的替代方案”之外,我找不到任何关于差异的文档。 lodash中的transform和reduce有什么区别(除了25% slower)?

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    我喜欢在使用实用程序之前深入研究源代码。对于 lo-dash 这可能很困难,因为所有实用程序中都有大量抽象的内部功能。

    所以明显的区别是:

    • 如果不指定累加器(通常称为memo 如果你习惯用下划线),_.transform 会猜测你是否想要 一个数组或对象,而 reduce 将使累加器成为集合的初始项。

    示例、数组或对象映射通过transform

    _.transform([1, 2, 3], function(memo, val, idx) {
        memo[idx] = val + 5;
    });
    // => [6, 7, 8]
    

    与 reduce(注意,你必须知道输入类型!)

    _.reduce([1, 2, 3], function(memo, val, idx) {
        memo[idx] = val + 5;
        return memo;
    }, []);
    

    因此,虽然下面的 reduce 将计算数组的总和,但使用 transform 则不可能,因为 a 将是一个数组。

    var sum = _.reduce([1, 2, 3, 4], function(a, b) {
        return a + b;
    });
    
    • 另一个很大的区别是您不必返回带有transform 的累加器,并且累加器不能更改值(即它始终是同一个数组)。我想说这是该函数的最大优势,因为我经常忘记使用 reduce 返回累加器。

    例如,如果您想使用 reduce 将数组转换为值字典,您可以编写如下代码:

    _.reduce([1, 2, 3, 4, 5], function(memo, idx) {
       memo[idx] = true;
       return memo;
    }, {});
    

    而使用 transform 我们可以很好地编写它,而无需像 reduce 那样返回累加器

    _.transform([1, 2, 3, 4, 5], function(memo, idx) {
       memo[idx] = true;
    }, {});
    
    • 另一个区别是我们可以通过返回 false 来退出变换迭代。

    总的来说,reduce 是一种更灵活的方法,因为您可以更好地控制累加器,但是对于某些情况,可以使用 transform 以更简单的方式编写等效代码。

    【讨论】:

    • 并且_.transform 在需要创建新数组/对象时优于_.each,因为您不必在迭代前声明变量。我也应该提到_.map,但无法有条件地将项目添加到集合中。
    • _.transform 也是可链接的,而 _.reduce 不是。
    • 另外,您可以通过_.transform github.com/lodash/lodash/issues/1444 取消
    【解决方案2】:

    transform 作用于对象,reduce 不作用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-17
      • 2016-12-06
      相关资源
      最近更新 更多