函数组合(pipe)通过将filter、map、reduce等封装为单参数纯函数并从左到右执行,提升可读性与复用性;需将原生数组方法转为接收数组返回新数组的函数,再用pipe组合。

函数组合(Pipe)能让多级 filter()、map()、reduce() 更清晰、可复用,避免嵌套过深或临时变量堆积。核心思路是把每个操作封装为纯函数,再用一个 pipe 函数从左到右依次执行。
把数组操作抽象成单参数纯函数
原生方法如 arr.filter(fn) 是实例方法,不能直接组合。需转为接收数组、返回新数组的函数:
filter(predicate) → (arr) => arr.filter(predicate)map(transform) → (arr) => arr.map(transform)reduce(reducer, init) → (arr) => arr.reduce(reducer, init)
例如:
const isEven = x => x % 2 === 0;const double = x => x * 2;
const sum = (a, b) => a + b;
再封装成可组合函数:
const filterEven = filter(isEven);const mapDouble = map(double);
const reduceSum = reduce(sum, 0);
实现一个简易 pipe 函数
pipe 接收多个函数,返回一个新函数,按顺序将上一步结果传给下一步:
使用示例:
const process = pipe(filterEven,
mapDouble,
reduceSum
);
process([1, 2, 3, 4, 5]); // → 12(即 (2+4)*2 = 12)
支持更灵活的操作:带参数的 reduce 或自定义逻辑
如果需要动态初始值或复杂聚合,可让 reduce 工厂函数接受参数:
(arr) => arr.reduce(reducer, typeof init === 'function' ? init(arr) : init);
比如求平均值:
const avg = pipe(filterEven,
mapDouble,
reduceWithInitial(
(sum, x) => sum + x,
() => 0
),
(sum) => sum / Math.max(1, [2, 4].length)
);
注意:最后一步可接任意函数(如除法),不限于数组方法。
借助工具库简化(可选)
Lodash 提供 flow()(即 pipe),Ramda 提供 R.pipe(),都默认支持自动柯里化和更安全的函数组合:
import { filter, map, reduce } from 'ramda';
const result = pipe(
filter(x => x > 2),
map(x => x ** 2),
reduce((a, b) => a + b, 0)
)([1, 2, 3, 4]); // → 25
Ramda 的函数天生适配组合:参数顺序友好、自动柯里化、不修改原数组。











