如何在 TypeScript 中实现嵌套对象的字段映射解析与反向映射生成
发布时间 - 2025-12-26 00:00:00 点击率:次本文介绍如何基于 json 路径(如 `$.offer.custom_fields.job_title`)自动提取嵌套对象的所有可映射字段,并与预定义的字段映射配置进行匹配,生成包含 `externalfieldid` 和对应 `integrationfieldid` 的标准化映射列表,缺失映射则置为空字符串。
在构建集成系统(如 HRIS ↔ ATS 数据同步)时,常需将源对象(如 API 响应)的嵌套字段路径与目标系统字段(如 $.engagementData.title)建立双向映射关系。本教程提供一种轻量、可复用的 TypeScript 方案,用于自动发现源对象所有深层字段路径,并精确匹配预设的映射规则,最终生成符合预期结构的映射清单。
✅ 核心步骤说明
- 递归提取所有字段路径:使用深度优先遍历,将嵌套对象转为标准 JSONPath 格式(如 $.offer.custom_fields.job_title);
- 匹配映射配置:遍历每个提取出的 externalFieldId,查找 defaultFieldMapping 中 path 值完全相等的条目,获取其 key(即 integrationFieldId);
- 补全未映射字段:对源对象中存在但未在 defaultFieldMapping 中声明的字段(如 $.offer.job_post),保留其路径并设置 integrationFieldId: ''。
? 实现代码(TypeScript 兼容)
function getDeepKeys(obj: Record): string[] { function* _getDeepKeys( current: Record , prefix: string ): Generator { for (const [key, value] of Object.entries(current)) { const path = `${prefix}${key}`; if (value !== null && typeof value === 'object' && !Array.isArray(value)) { yield* _getDeepKeys(value, `${path}.`); } else { yield path; } } } return [..._getDeepKeys(obj, '$.')]; } // 示例数据 const response = { offer: { custom_fields: { job_title: 'engineer', }, starts_at: 'test', job_post: 'test', }, }; const defaultFieldMapping = { '$.engagementData.title': { default: 'Software Engineer', path: '$.offer.custom_fields.job_title', fieldName: 'Title', }, '$.engagementData.startDateUTC': { default: null, path: '$.offer.starts_at', }, }; // 生成映射结果 const result = getDeepKeys(response).map(externalFieldId => { const matchedEntry = Object.entries(defaultFieldMapping).find( ([_, config]) => config.path === externalFieldId ); return { externalFieldId, integrationFieldId: matchedEntry ? matchedEntry[0] : '', }; }); console.log(result); // 输出: // [ // { externalFieldId: "$.offer.custom_fields.job_title", integrationFieldId: "$.engagementData.title" }, // { externalFieldId: "$.offer.starts_at", integrationFieldId: "$.engagementData.startDateUTC" }, // { externalFieldId: "$.offer.job_post", integrationFieldId: "" } // ]
⚠️ 注意事项
-
路径格式一致性:确保 response
对象的字段路径与 defaultFieldMapping.path 完全一致(包括 $. 前缀和点号分隔),否则匹配失败; - 避免数组干扰:当前 getDeepKeys 默认跳过数组(因 JSONPath 中数组索引需显式处理,如 $.items[0].name),如需支持数组,请扩展逻辑以识别 Array.isArray(value) 并递归处理各元素;
- 性能考量:对于超深或超大嵌套对象,建议增加递归深度限制或改用栈式迭代实现;
-
TypeScript 类型增强(推荐):
interface FieldMappingConfig { default: any; path: string; fieldName?: string; } type FieldMapping = Record;
该方案简洁可靠,无需外部依赖,可直接集成至数据适配层、ETL 配置工具或低代码映射编辑器中,显著提升字段映射的自动化程度与可维护性。
# js
# json
# typescript
# app
# 工具
# 栈
# Array
# 字符串
# 递归
# 对象
# etl
# 自动化
# 低代码
# 遍历
# 可直接
# 如需
# 并与
# 跳过
# 为空
# 但未
# 象中
# 复用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何实现邮箱地址验证功能_Laravel邮件验证流程与配置
INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
再谈Python中的字符串与字符编码(推荐)
如何用PHP工具快速搭建高效网站?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
三星网站视频制作教程下载,三星w23网页如何全屏?
做企业网站制作流程,企业网站制作基本流程有哪些?
音响网站制作视频教程,隆霸音响官方网站?
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
零服务器AI建站解决方案:快速部署与云端平台低成本实践
如何用已有域名快速搭建网站?
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
如何获取免费开源的自助建站系统源码?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?
如何为不同团队 ID 动态生成多个“认领值班”按钮
PHP 500报错的快速解决方法
Swift中swift中的switch 语句
猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?
如何打造高效商业网站?建站目的决定转化率
Laravel队列由Redis驱动怎么配置_Laravel Redis队列使用教程
Linux网络带宽限制_tc配置实践解析【教程】
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
如何在建站之星网店版论坛获取技术支持?
佛山网站制作系统,佛山企业变更地址网上办理步骤?
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
简单实现Android验证码
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
如何快速生成高效建站系统源代码?
智能起名网站制作软件有哪些,制作logo的软件?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】
网站广告牌制作方法,街上的广告牌,横幅,用PS还是其他软件做的?
Laravel如何处理JSON字段的查询和更新_Laravel JSON列操作与查询技巧
常州企业网站制作公司,全国继续教育网怎么登录?
IOS倒计时设置UIButton标题title的抖动问题
phpredis提高消息队列的实时性方法(推荐)
Python正则表达式进阶教程_复杂匹配与分组替换解析
个人网站制作流程图片大全,个人网站如何注销?
Mybatis 中的insertOrUpdate操作
Laravel如何使用withoutEvents方法临时禁用模型事件
如何在阿里云高效完成企业建站全流程?
javascript中对象的定义、使用以及对象和原型链操作小结
如何彻底删除建站之星生成的Banner?
如何快速配置高效服务器建站软件?
Windows驱动无法加载错误解决方法_驱动签名验证失败处理步骤


对象的字段路径与 defaultFieldMapping.path 完全一致(包括 $. 前缀和点号分隔),否则匹配失败;