javascript - lodash 中的 transform 和 reduce 有什么区别

标签 javascript lodash

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

最佳答案

我喜欢在引入实用程序之前深入研究源代码。对于 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 可用于以更简单的样式为某些情况编写等效代码。

关于javascript - lodash 中的 transform 和 reduce 有什么区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536627/

相关文章:

javascript - 完全按原样从响应中重新发送正文

javascript - uniq 两个数组对象,且真值优先

javascript - 使用 lodash 动态计算嵌套集合的平均值

javascript - 使用路径从对象中提取数据 - 包括数组中的所有数据

javascript - 如何通过比较对象中具有不同元素的两个对象数组来过滤数组?

javascript - parentsUntil() 是最好的函数吗?查询

javascript - jquery onclick 为拉出添加背景覆盖

javascript - 正则表达式条件先行 JavaScript

javascript - 在 Webview iOS 中注入(inject)一段 JavaScript 代码

javascript - _.invoke 方法在 Lodash 中如何工作?