柯里化不直接优化过滤性能,但能提升多维数组过滤的可复用性、可读性和配置灵活性;它将过滤条件封装为可预设、组合、复用的函数,如byIndexNotEmpty、byIdLengthGt、byPathNotEmpty等,并支持and组合与缺省跳过逻辑。

柯里化本身不直接优化过滤性能,但它能显著提升多维数组过滤逻辑的可复用性、可读性和配置灵活性。关键在于把“过滤条件”变成可预设、可组合、可复用的函数,而不是每次写重复的 filter() + 冗长判断。
把过滤维度抽成可复用的柯里化函数
比如你常要按子数组中第 N 位是否为空来过滤:
- 写一个通用函数:
const byIndexNotEmpty = index => item => item[index] !== ''; - 然后复用:
rows[0].filter(byIndexNotEmpty(1))(过滤 name 字段) - 再比如按 ID 长度筛选:
const byIdLengthGt = minLen => item => item[0]?.length > minLen;,调用rows[0].filter(byIdLengthGt(6))
组合多个柯里化条件做动态过滤
当需要同时满足多个嵌套规则时(如:name 不为空 且 ID 是数字字符串),柯里化让组合更自然:
- 定义:
const and = (...fns) => item => fns.every(fn => fn(item)); - 组合使用:
rows[0].filter(and(byIndexNotEmpty(1), byIndexMatches(0, /^\d+$/))) - 注意:每个条件都是单参数函数,天然适配柯里化风格,无需临时写匿名函数
预绑定上下文,简化多层嵌套访问
面对更深结构(如 [[{id: 'x', info: {name: ''}}]]),柯里化可封装路径提取逻辑:
立即学习“Java免费学习笔记(深入)”;
const byPathNotEmpty = (path) => item => { const val = path.split('.').reduce((o, k) => o?.[k], item); return val !== '' && val != null; };- 之后直接:
data.filter(byPathNotEmpty('info.name'))或data.filter(byPathNotEmpty('info.status')) - 避免每次写
item.info?.name !== ''这类易错、难维护的重复代码
配合 filter 实现“部分配置即生效”的过滤器
在 UI 场景中(如多选筛选),用户可能只选了国家没选作物。柯里化让条件“缺省即跳过”更清晰:
const filterBy = (key, allowedValues) => item => allowedValues.length === 0 || allowedValues.includes(item[key]);const filterByCountry = filterBy('country', ['CN', 'US']);const filterByCrop = filterBy('crop', []); // 空数组 → 恒为 true,不参与限制- 最终:
data.filter(and(filterByCountry, filterByCrop))


















