柯里化函数将多参数过滤逻辑拆分为可复用的“过滤器工厂”,支持按状态、类型、启用状态等预定义高阶函数,便于组合(如allPass)、动态参数(如containsText)及管道式调用,提升复用性与可读性。

柯里化函数能让你把多参数过滤逻辑拆成可复用的“过滤器工厂”,避免重复写相似条件,让数据过滤更清晰、更灵活。
用柯里化封装常用过滤条件
比如经常按状态(status)、类型(type)或是否启用(enabled)筛选数组,可以预先定义带默认行为的高阶函数:
- const byStatus = status => item => item.status === status;
- const byType = type => item => item.type === type;
- const isEnabled = item => item.enabled === true;
这样就能组合使用:data.filter(byStatus('active')).filter(byType('user')),每个过滤器职责单一,语义明确。
组合多个柯里化过滤器形成复合条件
不必嵌套多层 filter,可以用一个通用组合函数把多个单条件过滤器合并为一个:
立即学习“Java免费学习笔记(深入)”;
- const allPass = (...predicates) => item => predicates.every(fn => fn(item));
- const activeUsers = allPass(byStatus('active'), byType('user'), isEnabled);
- data.filter(activeUsers); // 一行搞定三重判断
支持动态参数 + 部分应用,提升复用性
当某些值在运行时才确定(如搜索关键词、时间范围),柯里化天然适配:
- const containsText = key => text => item => item[key]?.includes?.(text) || false;
- const nameIncludes = containsText('name'); // 工厂函数
- const filterByName = nameIncludes('john'); // 具体过滤器
- data.filter(filterByName);
同一个 containsText 可用于 name、email、desc 等任意字段,无需为每个字段写新函数。
配合管道式写法增强可读性(可选进阶)
如果项目中已用 Lodash 或自定义工具库,还能进一步链式调用:
- const filterUsers = pipe(byStatus('active'), byType('user'), isEnabled);
- data.filter(filterUsers);
这种风格把数据流从左到右表达得更直观,尤其适合复杂业务规则叠加。


















