闭包实现管道过滤的核心是每个清洗函数返回接收上一环节输出并处理的新函数,具有轻量、可组合、易测试等优势;通过工厂函数封装常见逻辑(如normalizetext、cleanphone),用pipe串联执行,支持错误透明、字段映射和批量处理。

用闭包实现管道过滤,核心是让每个清洗函数返回一个新函数,接收上一环节输出、处理后传给下一个。它不依赖框架,轻量、可组合、易测试。
闭包管道的基本结构
每个清洗步骤封装为一个闭包,捕获配置参数(如字段名、正则规则),返回一个接受数据的函数。多个步骤通过嵌套或链式调用串联:
- 输入数据 → 第一个闭包函数 → 中间结果 → 第二个闭包函数 → 最终结果
- 闭包天然隔离状态:比如
trimField("name")返回的函数只操作 name 字段,不影响其他字段 - 所有函数统一签名:
(data: any) => any,保证可插拔
构建可复用的清洗闭包
把常见清洗逻辑封装成工厂函数,每次调用生成定制化处理器:
-
去空格与大小写标准化:
const normalizeText = (field: string) => (item: Record<string any>) => ({ ...item, [field]: item[field]?.toString().trim().toLowerCase() })</string> -
手机号格式校验与清洗:
const cleanPhone = (field: string, strict = true) => (item: Record<string any>) => { const raw = item[field]; const digits = raw?.replace(/\D/g, "") || ""; return digits.length === 11 ? { ...item, [field]: digits } : strict ? null : item; }</string> -
条件过滤器:
const filterBy = (field: string, predicate: (v: any) => boolean) => (item: Record<string any>) => predicate(item[field]) ? item : null</string>
串联多个闭包形成管道
定义一个 pipe 函数,按顺序执行闭包,自动跳过 null 或 undefined 输出(模拟“短路”):
const pipe = (...fns: Function[]) => (input: any) => fns.reduce((acc, fn) => acc == null ? acc : fn(acc), input)- 使用示例:
const cleanUser = pipe( normalizeText("email"), cleanPhone("phone"), filterBy("status", v => v === "active") ); const result = cleanUser({ email: " USER@EXAMPLE.COM ", phone: "138-xxxx-xxxx", status: "active" }); // → { email: "user@example.com", phone: "138xxxxxxxx", status: "active" } - 支持动态拼装:根据配置列表生成管道,便于前端低代码清洗配置
增强实用性的小技巧
让工具链更贴近真实场景:
- 错误透明:每个闭包可选返回
{ data: ..., error?: string }结构,pipe 统一收集错误,方便调试 - 字段映射支持:增加
renameField(from, to)闭包,兼容不同来源数据结构 - 批量处理适配:管道函数本身可被
Array.map直接调用,无需额外封装 - 类型安全(TypeScript):用泛型约束输入输出类型,IDE 能推导每一步的字段变化
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











