如何在 TypeScript 中实现嵌套对象的字段映射解析与反向映射生成

发布时间 - 2025-12-26 00:00:00    点击率:

本文介绍如何基于 json 路径(如 `$.offer.custom_fields.job_title`)自动提取嵌套对象的所有可映射字段,并与预定义的字段映射配置进行匹配,生成包含 `externalfieldid` 和对应 `integrationfieldid` 的标准化映射列表,缺失映射则置为空字符串。

在构建集成系统(如 HRIS ↔ ATS 数据同步)时,常需将源对象(如 API 响应)的嵌套字段路径与目标系统字段(如 $.engagementData.title)建立双向映射关系。本教程提供一种轻量、可复用的 TypeScript 方案,用于自动发现源对象所有深层字段路径,并精确匹配预设的映射规则,最终生成符合预期结构的映射清单。

✅ 核心步骤说明

  1. 递归提取所有字段路径:使用深度优先遍历,将嵌套对象转为标准 JSONPath 格式(如 $.offer.custom_fields.job_title);
  2. 匹配映射配置:遍历每个提取出的 externalFieldId,查找 defaultFieldMapping 中 path 值完全相等的条目,获取其 key(即 integrationFieldId);
  3. 补全未映射字段:对源对象中存在但未在 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驱动无法加载错误解决方法_驱动签名验证失败处理步骤