函数柯里化本身不直接过滤字段,但能将数据清洗逻辑拆分为可复用、可组合、按需配置的单参数函数,从而自然支撑管道式逐层处理。

函数柯里化本身不直接“过滤字段”,但它能让你把数据清洗逻辑拆成可复用、可组合、按需配置的单参数函数,从而自然支撑管道式(pipeline)逐层处理——每层专注一个清洗规则,比如去空格、转小写、校验邮箱格式、移除敏感字段等。
用柯里化构造可配置的清洗单元
柯里化让每个清洗函数接收第一个参数(如字段名或规则配置),返回真正作用于数据对象的函数。这样就能提前定义规则,延迟执行:
// 柯里化:提取字段 + 转换值
const pickAndMap = (key) => (transform) => (obj) =>
obj && typeof obj === 'object' ? { [key]: transform(obj[key]) } : {}
// 使用示例:提取 name 字段并转小写
const cleanName = pickAndMap('name')(s => String(s || '').trim().toLowerCase())
cleanName({ name: ' JOHN DOE ' }) // { name: 'john doe' }
构建清洗管道(Pipeline)串联多层过滤
把多个柯里化后的清洗函数(每个只处理一个字段或一类规则)用管道函数串起来,实现“输入 → 字段提取 → 类型转换 → 格式校验 → 敏感字段剔除”的逐层流转:
// 简单管道工具
const pipe = (...fns) => (x) => fns.reduce((v, f) => f(v), x)
// 柯里化清洗器
const ensureString = (key) => (obj) => ({ ...obj, [key]: String(obj[key] || '') })
const trimField = (key) => (obj) => ({ ...obj, [key]: String(obj[key] || '').trim() })
const removeIfEmpty = (key) => (obj) => obj[key] ? obj : Object.fromEntries(Object.entries(obj).filter(([k]) => k !== key))
// 组合:对 email 字段做三步清洗
const cleanEmail = pipe(
ensureString('email'),
trimField('email'),
removeIfEmpty('email')
)
cleanEmail({ email: ' user@EXAMPLE.COM ' }) // { email: 'user@example.com' }
cleanEmail({ email: '' }) // {}
动态字段过滤:用柯里化支持运行时配置
当清洗规则需根据场景切换(如不同接口要过滤不同字段),柯里化可预先绑定字段列表,避免重复写 if/else:
立即学习“Java免费学习笔记(深入)”;
// 柯里化:生成“只保留指定字段”的清洗器
const keepOnly = (keys) => (obj) =>
Object.fromEntries(keys.map(k => [k, obj[k]]).filter(([, v]) => v !== undefined))
// 柯里化:生成“删除指定字段”的清洗器
const omitFields = (keys) => (obj) =>
Object.fromEntries(Object.entries(obj).filter(([k]) => !keys.includes(k)))
// 使用
const sanitizeUser = pipe(
omitFields(['password', 'token']), // 先删敏感字段
keepOnly(['id', 'name', 'email']) // 再只留必要字段
)
sanitizeUser({ id: 1, name: 'Alice', email: 'a@b.c', password: 'xxx', token: 'abc' })
// → { id: 1, name: 'Alice', email: 'a@b.c' }
与真实清洗库(如 io-ts、Zod)协同增强类型安全
柯里化清洗函数可包装校验逻辑,在管道中嵌入类型断言,失败时跳过或报错:
import { isEmail } from 'validator'
// 柯里化邮箱校验:通过则保留,否则抹掉字段
const validateEmail = (key) => (obj) => {
const val = obj[key]
return isEmail(val) ? obj : { ...obj, [key]: undefined }
}
const safeClean = pipe(
trimField('email'),
validateEmail('email'),
removeIfEmpty('email')
)


















