函数柯里化可将多参函数转为单参函数链,配合filter能固化校验条件、生成语义清晰的可复用过滤器;通过byfield解耦字段与判定逻辑,支持任意谓词;可用and组合多个校验器实现复合条件,并推荐纯函数、typescript泛型等工程实践。

函数柯里化可以将一个接收多个参数的函数,转换为一系列只接收单个参数的函数。配合 filter 使用时,能提前固化校验规则中的部分条件,生成可复用、语义清晰的过滤器函数。
柯里化校验函数的基本结构
先写一个通用的柯里化校验器,比如判断数值是否在某个范围内:
const inRange = (min) => (max) => (value) => value >= min && value
这样 isTeenager 就是预设了上下限的、可直接传给 filter 的纯函数,无需每次重复写条件逻辑。
处理对象数组的字段校验
常见需求是按对象某个属性做条件过滤。柯里化可封装“字段名 + 判定逻辑”:
const byField = (key) => (predicate) => (item) => predicate(item[key]);
// 示例:筛选 status 为 'active' 的用户
const isActive = byField('status')((v) => v === 'active');
users.filter(isActive);
// 复用:筛选 age > 18 的用户
const isAdult = byField('age')((v) => v > 18);
users.filter(isAdult);
这种写法把“查哪个字段”和“怎么判断”解耦,既支持简单相等,也支持任意判定函数(如正则、范围、存在性等)。
组合多个柯里化校验器
用函数组合(compose)或链式调用,构建复合条件。例如同时满足“状态为 active”且“分数大于 80”:
const and = (...fns) => (x) => fns.every(f => f(x));
const hasStatus = byField('status')((v) => v === 'active');
const hasScore = byField('score')((v) => v > 80);
const meetsAll = and(hasStatus, hasScore);
users.filter(meetsAll);
也可以进一步柯里化 and 本身,实现 and(hasStatus)(hasScore) 风格,增强一致性。
实际工程中的小技巧
- 用箭头函数保持简洁,避免
this干扰; - 校验函数应是纯函数,不依赖外部状态,确保
filter结果可预测; - 对高频使用的校验逻辑(如非空、字符串包含、日期区间),提前导出命名函数,提升可读性;
- 配合 TypeScript 可为柯里化函数添加泛型,保障类型安全(如
byField<user>('name')</user>)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











