You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 23:33:25