js数组方法之Reduce

reduce()和reduceRight()方法使用指定的函数将数组元素进行组合,生成单个值,这个生成单个值很重要,开发过程中往往会用到这个值。这在函数式编程中是常见的操作,通常被称为“注入”和“折叠”。

下面先举例说明一下reduce是如何工作的:

1
2
3
4
var a = [1,2,3,4,5];
var sum = a.reduce((x,y) => x+y, 0); // 数组求和
var product = a.reduce((x,y) => x*y, 1); // 数组求积
var max = a.reduce((x,y) => (x>y) ? x : y); // 求最大值

reduce()需要两个参数。第一个是执行化简操作的函数。华简函数的任务就是用某种方法把两个值组合或化简为一个值,并返回化简后的值。在上述的例子中,函数通过加法,乘法或取最大值法的方法组合两个值。第二个参数是一个传递给函数的初始值,此参数是可选的,不传的时候,默认是将数组的第一个作为初始值使用。

reduce()使用的函数与forEach()和map()使用的函数不同。比较熟悉的是,数组元素、元素的索引和数组本身将作为第2~4个参数传递给函数。第一个参数是到目前为止的华简操作累积的结果。第一次调用函数时,第一个参数是一个初始值,它就是传递给reduce()的第二个参数。

另外一点需要我们注意,那就是在空数组上,不带初始值参数调用reduce()将导致类型错误异常。如果调用它的时候只有一个值——数组只有一个元素并且没指定初始值,或者一个空数组并且指定一个初始值——reduce()只是简单地返回那个值而不会调用化简函数。

reduceRight()函数的工作原理跟reduce()一样,不同的是它按照的数组索引的从高到低处理数组。

下面举个使用reduce()函数能快速解决问题的例子,题目如下:

一个无序数组里有若干个正整数,范围从1到100,其中99个整数都出现了偶数次,只有一个整数出现了奇数次(比如1,1,2,2,3,3,4,5,5),如何找到这个出现奇数次的整数?

使用reduce()函数就很简单的得到结果了

1
2
var arr = [1,1,2,2,3,3,4,5,5]
arr.reduce((x,y) => x^y); // 即可得到答案 4

总结:

为了简单起见,为目前为止,所展示的例子都是数值,但数学的计算不是reduce()和reduceRight()唯一意图。这两个函数可以结合其他函数可以达到意想不到的结果,而且在性能上也可能有大提升。
希望大家能提出建议和要求,谢谢!