arr.reduce(callback,[initialValue])
reduce() 函数将多个值缩减为一个,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素值,当前索引,调用 reduce 的数组。
1 | callback (执行数组中每个值的函数,包含四个参数) |
实例解析 initialValue 参数
无 initialValue 参数
1 | var arr = [1, 2, 3, 4]; |
这里可以看出,上面的例子index是从1开始的,第一次的prev的值是数组的第一个值。数组长度是4,但是reduce函数循环3次。
有 initialValue 参数
1 | var arr = [1, 2, 3, 4]; |
打印结果:
0 1 0
1 2 1
3 3 2
6 4 3
[1, 2, 3, 4] 10
这个例子index是从0开始的,第一次的prev的值是我们设置的初始值0,数组长度是4,reduce函数循环4次。
结论:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。
注意:如果这个数组为空,运用reduce是什么情况?
1 | var arr = []; |
但是要是我们设置了初始值就不会报错,如下:
1 | var arr = []; |
所以一般来说我们提供初始值通常更安全
手写 reduce
1 | Array.prototype.reduce = function(fn, init) { |
简单用法
常用的数组求和,求乘积
1 | var arr = [1, 2, 3, 4]; |
高级用法
(1)计算数组中每个元素出现的次数
1 | let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; |
(2)数组去重
1 | let arr = [1,2,3,4,4,1] |
(3)将二维数组转化为一维
1 | let arr = [[0, 1], [2, 3], [4, 5]] |
(3)将多维数组转化为一维
1 | let arr = [[0, 1], [2, 3], [4,[5,6,7]]] |
(4)对象里的属性求和
1 | var result = [ |
与 Math.pow 的一道题
1 | [3,2,1].reduce(Math.pow) |