lodash中transform和reduce之间的区别是什么

时间:2014-02-03 20:03:38

标签: javascript lodash

除了声明“转换是一种更有效的替代方法”之外,我找不到差异的文档。 lodash中的transform和reduce之间有什么区别(除了25% slower之外)?

2 个答案:

答案 0 :(得分:82)

在拉入实用程序之前,我想深入了解源代码。对于lo-dash而言,这可能很困难,因为所有实用程序中都有大量抽象的内部功能。

所以明显的区别是:

  • 如果您未指定累加器(通常称为备忘录 如果您习惯于强调,_.transform会猜测您是否愿意 一个数组或对象,而reduce将使累加器成为集合的初始项。

示例,通过transform的数组或对象映射:

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

Versus reduce(注意,您必须知道输入类型!)

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

因此,使用reduce时,下面将计算数组的总和,这对于变换是不可能的,因为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;
}, {});

然而对于变换,我们可以很好地编写这个,而不需要像reduce

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

总的来说,我认为reduce是一种更灵活的方法,因为你可以更好地控制累加器,但转换可以用来为更简单的样式编写等效代码。

答案 1 :(得分:-4)

转换适用于对象,reduce不是