【发布时间】:2014-02-27 11:40:06
【问题描述】:
除了说“转换是减少的更强大的替代方案”之外,我找不到任何关于差异的文档。 lodash中的transform和reduce有什么区别(除了25% slower)?
【问题讨论】:
标签: javascript lodash
除了说“转换是减少的更强大的替代方案”之外,我找不到任何关于差异的文档。 lodash中的transform和reduce有什么区别(除了25% slower)?
【问题讨论】:
标签: javascript lodash
我喜欢在使用实用程序之前深入研究源代码。对于 lo-dash 这可能很困难,因为所有实用程序中都有大量抽象的内部功能。
所以明显的区别是:
_.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;
}, {});
总的来说,reduce 是一种更灵活的方法,因为您可以更好地控制累加器,但是对于某些情况,可以使用 transform 以更简单的方式编写等效代码。
【讨论】:
_.transform 在需要创建新数组/对象时优于_.each,因为您不必在迭代前声明变量。我也应该提到_.map,但无法有条件地将项目添加到集合中。
_.transform 也是可链接的,而 _.reduce 不是。
_.transform github.com/lodash/lodash/issues/1444 取消
transform 作用于对象,reduce 不作用
【讨论】: