TypeScript按指定规则转换复杂JSON结构求助
数组结构转换实现方案
问题场景
现有如下结构的HealthPolicy数组:
const HealthPolicy = [ { Subno: "12345" }, // 第一组,以SubNo起始 { PolicyNo: "78956Frtg" }, { canNo: "78464" }, { RenNo: "724643" }, { RiNo : "84646" }, { canNo: "8464646" }, // 第一组结束 { Subno: "12344" }, // 第二组 { PolicyNo: "84567yuij" }, { RenNo: "78784" }, { RenNo : "879636" }, { Subno: "12341" }, // 第三组 { PolicyNo: "34567drgu" }, { rftNo: "79784" }, // ... 更多元素 ];
需要将其转换为按PolicyNo分组的finalHealth结构,要求每个分组的details中,SubNo固定为serialNo:1的元素,其余动态键值对按原顺序排列,目标结构如下:
const finalHealth = [ { PolicyNo: "78956Frtg", details: [ { serialNo : 1, jobName: "SubNo", jobId: "12345", }, { serialNo : 2, jobName: "CanNo", jobId: "78464", }, // ... 其余动态元素 ] }, // ... 更多分组 ];
实现代码(JavaScript)
function transformHealthPolicy(HealthPolicy) { const finalHealth = []; let currentGroup = null; let currentSubNo = null; let serialCounter = 2; // SubNo占serialNo=1,后续元素从2开始计数 // 统一键名格式,匹配目标结构的jobName规范 const formatJobName = (key) => { const lowerKey = key.toLowerCase(); if (lowerKey === "subno") { return "SubNo"; } // 其他键首字母大写,保留原后续字符格式 return key.charAt(0).toUpperCase() + key.slice(1); }; for (const item of HealthPolicy) { // 每个元素仅包含一个键值对,直接解构获取 const [key, value] = Object.entries(item)[0]; const jobName = formatJobName(key); if (jobName === "SubNo") { // 记录当前分组的SubNo信息,固定为serialNo=1 currentSubNo = { serialNo: 1, jobName: "SubNo", jobId: value }; } else if (jobName === "PolicyNo") { // 创建新分组,初始化details并放入SubNo currentGroup = { PolicyNo: value, details: [currentSubNo] }; finalHealth.push(currentGroup); serialCounter = 2; // 重置后续元素的序号计数器 } else { // 将动态键值对按顺序加入当前分组的details if (currentGroup) { currentGroup.details.push({ serialNo: serialCounter++, jobName, jobId: value }); } } } return finalHealth; } // 调用示例 const HealthPolicy = [ { Subno: "12345" }, { PolicyNo: "78956Frtg" }, { canNo: "78464" }, { RenNo: "724643" }, { RiNo : "84646" }, { canNo: "8464646" }, { Subno: "12344" }, { PolicyNo: "84567yuij" }, { RenNo: "78784" }, { RenNo : "879636" }, { Subno: "12341" }, { PolicyNo: "34567drgu" }, { rftNo: "79784" } ]; console.log(transformHealthPolicy(HealthPolicy));
关键逻辑说明
- 分组触发:以
SubNo标记新分组起始,遇到PolicyNo时创建正式分组对象,自动将之前记录的SubNo放入details的首位。 - 键名统一:处理原数组中键名的大小写差异,确保
jobName完全匹配目标格式(如canNo→CanNo、Subno→SubNo)。 - 顺序维护:动态元素严格按原数组遍历顺序添加,
serialNo自动递增,保证结构顺序与原数据一致。 - 边界防护:仅当当前分组已创建时,才添加动态元素,避免空分组或无效赋值。
内容的提问来源于stack exchange,提问作者Sundaresan.C
相关产品推荐
相关产品推荐

