手写compose函数
hyhyy 博主

什么是compose函数

compose是函数式编程中使用较多的一种写法, 它把逻辑解耦在各个函数中,通过compose的方式组合函数, 将外部数据依次通过各个函数的加工,生成结果。

将两个函数组合

1
const compose = (fn1, fn2) => x => fn1(fn2(x))

将多个函数组合

1
const compose = (f1, ..., fn) => x => f1(...(fn(x)))

思路

使用reduce函数的特性:对数组中的每个元素执行一个由你提供的reducer函数(升序执行),将其结果汇总为单个返回值

1
2
3
4
5
const reducer =  (accumulator, currentvalue) => {
return (x) => {
return accumulator(currentvalue(x))
}
}

题目

实现一个 compose 函数 将 compose(a,b,c)(…args) 转化成 a(b(c(…args)))

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 用法如下:
function fn1(x) {
return x + 1;
}
function fn2(x) {
return x + 2;
}
function fn3(x) {
return x + 3;
}
function fn4(x) {
return x + 4;
}
const a = compose(fn1, fn2, fn3, fn4);
console.log(a(1)); // 1+4+3+2+1=11

实现代码如下:

1
2
3
4
5
6
7
8
9
function compose(...fn) {
if (!fn.length) return (v) => v;
if (fn.length === 1) return fn[0];
return fn.reduce(
(pre, cur) =>
(...args) =>
pre(cur(...args))
);
}

题目改成从左向右执行

只需要将 reduce 改成 reduceRight

1
2
3
4
5
6
7
8
9
function compose(...fn) {
if (!fn.length) return (v) => v;
if (fn.length === 1) return fn[0];
return fn.reduceRight(
(pre, cur) =>
(...args) =>
pre(cur(...args))
);
}