组合函数定义
组合函数是纯函数衍生出来的一种函数,把一个纯函数的结果做为另一个纯函数的输入,最终得到一个新的函数,就是组合函数,组合函数是从右到左的数据流,例如
const compose = (f1, f2) => value => f1( f2(value) );
举个例子,我们需要实现一个 fullname 的功能
function connect(firstName, lastName) { return firstName + lastName;}function toUpperCase(name) { return name.toUpperCase();}
把上面两个函数组合起来就变成了下面的函数,叫做组合函数
function fullname(firstName, lastName) { return toUpperCase(connect(firstName, lastName));}fullname('huang', 'kailun');
这个只是一个简单的例子,为了说明把多个功能函数组合成一个更高级功能的函数。
组合函数转换器
上面的例子是两个纯函数的组合,如果是多个函数的组合(比如 f, f1, f2, f3),类似于下面的组合,就会变得很恶心
function componse(...args) { return f(f2(f3(f4(...args))));}
这时候就需要一种组合函数转换器,通过传递函数数组来自动帮我们转为成组合函数,结构类似于
const componse = (...functions) => (...args) => { // 转换操作 return newFunction; };
Javascript 给数组对象提供了一个 reduceRight()
方法,接收一个函数作为累加器,数组从右到左开始缩减,最终计算为一个值,使用如下
[1, 2, 3].reduceRight((prev, curr) { return prev + curr }, 0) // 6
我们可以利用 reduceRight
这一个特性来实现组合函数转换器
const componse = (...fns) => fns.reduceRight( (pFn, cFn) => (...args) => cFn(pFn(...args)) );
测试效果
// 新增一个hello函数function hello(name) { return `hello ${name}`;}const sayHello = componse(hello, toUpperCase, connect);console.log(sayHello('huang', 'kelen')); // hello HUANG KAILUN