柯里化简化JSON深度路径提取,核心是将路径访问封装为可复用、可组合、带默认值的一元函数链,如safeGet、jsonPathGet,并通过compose组合多级操作,提升可读性、可测性与可维护性。

用柯里化简化 JSON 深度路径提取,核心是把“取某个路径的值”这个动作,变成可复用、可组合、带默认行为的一元函数链。它不直接解析 JSON,而是让路径访问逻辑更清晰、更易测试、更少重复。
把路径访问封装成可柯里化的基础函数
先写一个通用的 safeGet 函数:接收路径(字符串或数组)、默认值、再接收目标对象,最后返回值。它内部处理 undefined、null、越界等边界情况,避免运行时报错。
例如:
- safeGet('user.profile.name', '匿名') → 返回一个等待对象的函数
- safeGet(['data', 'items', 0, 'id'], null)(json) → 直接取值,安全兜底
这个函数本身是三参数函数,但通过柯里化后,前两个参数可预置,第三个参数(数据源)留到最后传入,方便后续组合或批量调用。
配合 JSONPath 表达式做语义化路径抽象
如果项目中大量使用类似 $.store.book[0].title 这类 JSONPath,可以封装 jsonPathGet,它内部调用 JSONPath 库(如 Jayway JsonPath),但对外暴露柯里化接口:
- jsonPathGet('$.contact_info[0].contact_status.exam_status')(json) → 提取第一个联系人的考试状态
- const getTermCode = jsonPathGet('$.term_list[0].term_code') → 复用在多个地方
这样就把原始 JSON 结构的“硬编码路径”从业务逻辑里抽离出来,路径表达式只出现在定义层,而不是每次调用都拼接字符串。
用 compose 组合多级提取与转换
当需要“先取数组、再过滤、再取字段”,柯里化 + compose 就显出优势。比如从嵌套 term_list 中找 status=1 的第一个 s_code:
- const getActiveSCode = compose(
- path('s_code'),
- find(x => x.sexam_status === 1),
- path('t_list'),
- path('term_list[0]')
- );
每个函数都是一元、纯函数、可单独测试;整个链路顺序明确,调试时也能逐层 inspect 中间结果。
为不同结构预设常用提取器
针对固定 Schema 的 JSON(如 API 响应格式稳定),可提前定义一组柯里化提取器:
- const getId = safeGet('id');
- const getContactStatus = safeGet('contact_info[0].contact_status.exam_status');
- const getFirstTermCode = safeGet('contact_info[0].contact_status.term_list[0].term_code');
这些函数可导出为工具模块,在 service 层或 selector 层直接 import 使用,避免每个文件都手写 path 字符串和空值判断。
不复杂但容易忽略:柯里化本身不解决 JSON 解析,但它让路径访问变得声明式、可预测、易维护。真正起作用的是“把路径逻辑从 if/else 和 try/catch 里解放出来”。


















