前言

reduce这个方法真的已经学习过很多次了,学了之后也很少用,又不记得了~ :joy:再来复习一遍。

reduce

arr.reduce(fn)的返回值是处理的结果;
reduce 函数接收4个参数:

  • Accumulator (acc) (累计器) 
  • Current Value (cur) (当前值)
  • Current Index (idx) (当前索引)
  • Source Array (src) (源数组)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let arr = [1, 2, 3, 4, 5, 6];

/**
* 对数据进行累加
* @param {*} acc 累计的值
* @param {*} item 数组的每一项数据
*/
let fn = function (acc, item) {
return acc + item
}

let result = arr.reduce(fn); // 运行过程 1 + 2 + 3 + 4 + 5 + 6
let result_1 = arr.reduce(fn, 0); // 运行过程 0 + 1 + 2 + 3 + 4 + 5 + 6

console.log(result); // 21
console.log(result_1); // 21

reduceRight

reduceRight方法接受一个函数作为累加器(accumulator)和数组的每个值(从右到左)将其减少为单个值。

1
2
3
4
5
6
7
8
9
10
11
let arr = [[1, 2],[3, 4],[5, 6]];

let fn = function (acc, item) {
return acc.concat(item)
}
let result = arr.reduce(fn);
let result_1 = arr.reduceRight(fn);

console.log(result); // [ 1, 2, 3, 4, 5, 6 ]
console.log(result_1); // [ 5, 6, 3, 4, 1, 2 ]

compose

返回值是一个函数, 入参也是函数, 执行的结果作为下一个执行函数的入参.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function compose(){
var args = [].slice.call(arguments);

return function(initArg){
return args.reduce(function(init, current){
return current(init);
},initArg)
}
}
      
// 使用例子
const g = (y) => y + 1
const f = (x) => 2 * x

const w = compose(g, f);
console.log(w(1)) // 4
console.log(w(2)) // 6
console.log(w(3)) // 8