除了声明“转换是一种比reduce更强大的选择”之外,我找不到有什么不同的文档。在lodash中,transform和reduce有什么不同(除了是25% slower)?
发布于 2014-02-04 04:23:39
在引入实用程序之前,我喜欢深入研究源代码。对于lo来说,这可能很困难,因为在所有实用程序中都有大量抽象的内部功能。
因此,明显的区别是:
_.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可以用一种更简单的风格来编写等价的代码。
发布于 2017-12-22 09:43:31
变换对对象起作用,reduce则不起作用
https://stackoverflow.com/questions/21536627
复制相似问题