首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在lodash中,转换和减少有什么区别?

在lodash中,转换和减少有什么区别?
EN

Stack Overflow用户
提问于 2014-02-04 04:03:38
回答 2查看 31.5K关注 0票数 59

除了声明“转换是一种比reduce更强大的选择”之外,我找不到有什么不同的文档。在lodash中,transform和reduce有什么不同(除了是25% slower)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-04 04:23:39

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

因此,明显的区别是:

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

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

代码语言:javascript
复制
_.transform([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
});
// => [6, 7, 8]

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

代码语言:javascript
复制
_.reduce([1, 2, 3], function(memo, val, idx) {
    memo[idx] = val + 5;
    return memo;
}, []);

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

代码语言:javascript
复制
var sum = _.reduce([1, 2, 3, 4], function(a, b) {
    return a + b;
});

  • 另一个很大的区别是你不需要用transform返回累加器,并且累加器不能改变值(即它总是相同的数组)。我想说这是这个函数最大的优点,因为我经常忘记使用reduce返回累加器。

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

代码语言:javascript
复制
_.reduce([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
   return memo;
}, {});

而使用transform,我们可以写得非常好,而不需要像reduce中那样返回累加器

代码语言:javascript
复制
_.transform([1, 2, 3, 4, 5], function(memo, idx) {
   memo[idx] = true;
}, {});

  • 另一个区别是我们可以通过返回false来退出转换迭代。

总的来说,我想说reduce是一种更灵活的方法,因为你对累加器有更多的控制,但在某些情况下,transform可以用一种更简单的风格来编写等价的代码。

票数 96
EN

Stack Overflow用户

发布于 2017-12-22 09:43:31

变换对对象起作用,reduce则不起作用

票数 -5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21536627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档