前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >6个关于Reduce() 应用场景的用例

6个关于Reduce() 应用场景的用例

作者头像
前端达人
发布2021-10-08 11:32:13
1.6K0
发布2021-10-08 11:32:13
举报
文章被收录于专栏:前端达人

reduce 方法在数组的每个元素上执行用户提供的回调函数,即“reducer”。它传入对前一个元素进行计算的返回值。结果是单个值。它是在数组的所有元素上运行 reducer 的结果。

它是如何工作的?

reducer 函数逐个遍历数组元素。在每一步中,reducer 函数将当前数组值添加到上一步的结果中,直到没有更多元素要添加。

参数是什么?

参数是回调函数和可选的初始值。

回调函数

preVal:它是前一个回调函数产生的前一个值。

currVal:它是数组的当前元素,reducer 函数会传播它。

currentIndex:当前索引。但是,它是可选的。

arrayToTraverse:要遍历的数组。它也是可选的。

初始值

初始值参数是可选的。它是第一次调用回调时,将前一个值初始化的值。如果未指定初始值,则将前一个值初始化为初始值,将当前值初始化为数组中的第二个值。

在某些情况下,Reduce 方法是一种有价值的方法。在某些情况下,它可能会节省你的时间或减少你程序行数。在本文中,我将向你展示 JavaScript 中 reduce() 方法的6个用例。

1、对数组元素求和

假设你有以下数组:

代码语言:javascript
复制
const prices = [5.99, 2.99, 3.99, 11.59]

你可能更喜欢使用 for 循环或 for-each 循环来对上述数组的元素求和,但是,如果使用 reduce(),则可以编写更少的代码。

正如你从介绍中知道的那样,reduce() 接受一个带有4个参数的函数,preVal、currVal、currentIndex、prices,在这种情况下,

你需要传递给 reduce 的第二个参数,是你想要启动的初始值。例如,如果你希望对数组的元素求和,可以将 0 作为初始值。

代码语言:javascript
复制
const sum = prices.reduce((preVal, currVal, currentIndex, prices) => {
  return preVal + currVal;
}, 0);

reduce() 对数组中的每个元素执行这个函数。第一次执行的 preVal 是你设置为第二个参数的初始值,在本例中为“0”。否则,它将是未定义的。currVal 是数组的第一个元素。对于第二次执行,对数组中的第二个元素执行以下函数:

代码语言:javascript
复制
(preVal, currVal, currentIndex, prices) => {
  return preVal + currVal;
}

现在,preVal 不是 0。它等于前一次执行中返回的值。所以,preVal = 5.99 + 0。现在,currVal 是第二次迭代的第二个元素。

在这种情况下,你不需要 currentIndex 和prices。因此,你可以将该函数编写为单行函数。

代码语言:javascript
复制
const sum = prices.reduce((preVal, currVal) => preVal + currVal, 0);

2、展平数组

使用reduce(),你可以将多维数组转换为一维数组。

代码语言:javascript
复制
var rows = [[2, 3, 5], [1, 2, 4], [8, 5, 5]]
var matrixElements = rows.reduce( function (prev, current) {
  return prev.concat(current);
});

3、创建管道

此外,你可以减少函数以及数字和字符串。假设你有一系列数学函数。例如,你有以下功能:

代码语言:javascript
复制
function increment(input) { return input + 1;}
function decrement(input) { return input - 1; }
function double(input) { return input * 2; }
function halve(input) { return input / 2; }

此外,你希望对订单使用 increment、double 和 decrement。因此,你可以创建管道。然后,你可以将它与 reduce() 一起使用。

代码语言:javascript
复制
let pipeline = [increment, double, decrement];

const result = pipeline.reduce(function(total, func) {
  return func(total);
}, 8);

// result: 17

4、 从数组中获取对象

例如,你有一个字符串数组,它们是彩色苹果。使用 reduce() 你可以构造一个苹果对象,如下所示。

代码语言:javascript
复制
const apples = ['green', 'red', 'red', 'yellow', 'red', 'yellow', 'green', 'green'];
var appleMap = apples.reduce((prev, apple) => {
  if (prev[apple] >= 1) prev[apple]++;
  else prev[apple] = 1;
  return prev;
}, {});

console.log(appleMap);
// result: {green: 3, red: 3, yellow: 2}

5、找出出现奇数次的整数

你可以使用 reduce() 来查找在给定数组中出现奇数次的整数。下面的函数有一个不好的地方。如果你给出多个出现奇数次的整数,它将不起作用。

代码语言:javascript
复制
const findOdd = (a) => a.reduce((a, b) => a ^ b);
console.log(findOdd([1, 2, 2, 1])); // Result: 0
console.log(findOdd([1, 2, 2, 1, 2, 3, 3])); // Result: 2
console.log(findOdd([1, 2, 3, 4])); // Result: 4 -> Not working

6、求给定数组的最大子数组和

使用此函数,你可以找到给定数组的最大子数组和。这是一个需要解决的大问题。解决起来并不容易。尤其是想用单线方案来实现这个功能,就更具挑战性了。但是,如果使用reduce() 会更容易。

代码语言:javascript
复制
const maxSequence = (a,sum=0) => a.reduce((max,v) => Math.max(sum = Math.max(sum + v, 0), max), 0);
console.log(maxSequence([1,2,3,4])); // Result: 10
console.log(maxSequence([1,2,3,4,-8])); // Result: 10
console.log(maxSequence([1,-2,3,-2,5,-1,3,-9,1,6])); // Result: 8

加餐:reduceRight()

你也可以使用reduceRight()。它的工作方式与reduce() 相同。但是,它的工作方向相反。当你学习时,reduce() 从第一个元素开始并朝最后一个元素移动。相反,reduceRight() 从最后一个元素开始,然后转到第一个元素。

代码语言:javascript
复制
const prices = [5.99, 2.99, 3.99, 11.59];

let sum = prices.reduceRight(function (preVal, currVal) {
    console.log('prev: ', preVal, 'curr: ', currVal);
    return prev + curr;
});
console.log(sum);

// prev:  11.59 curr:  3.99
// prev:  15.58 curr:  2.99
// prev:  18.57 curr:  5.99
// 24.560000000000002

结论

了解 JavaScript 中一些内置函数的用例可以帮助你提高编码技能。学习用例可以为你提供一些见解,你可以优雅地实现一些功能。

JavaScript 中的 reduce() 也是一个有用的内置函数。如果你知道如何使用它,它是强大的。它可以帮助你编写较少数量的代码行,如汇总价格的示例。

综上所述,本文reduce()的用例如下:

  • 对数组元素求和
  • 展平数组
  • 创建管道
  • 从数组中获取对象
  • 找出出现奇数次的整数
  • 查找给定数组的最大子数组和。

感谢你的时间,希望这篇文章内容对你有所帮助,如果你觉它有用,也请你分享给你身边做开发的朋友。

谢谢你的阅读,祝编程愉快!

学习更多技能 请点击下方公众号

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端达人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 学习更多技能 请点击下方公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档