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

如何在Node.js中用递归处理嵌套JSON:扁平化并移除空对象

递归处理嵌套JSON:将内层_text值提升到父键并清理空对象

Hey there! 作为JavaScript新手碰到这种嵌套JSON的处理确实容易头大,我来帮你搞定这个需求。我们需要写一个递归函数,遍历整个JSON结构,完成三个核心操作:

  • 如果一个对象只有_text属性,就把这个值直接赋给父键
  • 移除所有空对象
  • 对嵌套的子对象重复这个逻辑

完整代码实现

function transformJson(obj) {
  // 兼容数组场景(如果你的JSON后续包含数组也能处理)
  if (Array.isArray(obj)) {
    return obj.map(item => transformJson(item)).filter(item => item !== undefined);
  }

  // 非对象类型直接返回(比如字符串、数字等)
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  const transformed = {};

  // 遍历当前对象的所有属性
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      const value = obj[key];

      // 检查当前值是否是仅包含`_text`的对象
      if (typeof value === 'object' && value !== null && Object.keys(value).length === 1 && '_text' in value) {
        // 将`_text`的值直接赋值给当前键
        transformed[key] = value._text;
      } else {
        // 递归处理子对象
        const processedValue = transformJson(value);
        // 过滤掉处理后为空的对象
        if (processedValue !== undefined && !(typeof processedValue === 'object' && Object.keys(processedValue).length === 0)) {
          transformed[key] = processedValue;
        }
      }
    }
  }

  // 如果处理后的对象为空,返回undefined以便上层过滤;否则返回处理后的对象
  return Object.keys(transformed).length > 0 ? transformed : undefined;
}

// 测试你的原始JSON
const originalJson = { "Changes_Only": { "_text": "some value" }, "Legal_Employee_Id": {}, "EmployeeData": { "OBJECT_ACTION_ID": { "_text": "some value" }, "Employee": { "PersonID": { "_text": "some value" }, "PersonID_OLD": {}, "PersonNumber": { "_text": "some value" }, "PersonNumber_OLD": {}, "StartDate": { "_text": "some value" }, "StartDate_OLD": {}, "PersonType": { "_text": "some value" }, "PersonType_OLD": {}, "DateofBirth": { "_text": "some value" }, "DateofBirth_OLD": {}, "HireDate": { "_text": "some value" }, "HireDate_OLD": {}, "WorkEmail": { "_text": "some value" }, "WorkEmail_OLD": {}, "FirstName": { "_text": "some value" }, "FirstName_OLD": {}, "LastName": { "_text": "some value" }, "LastName_OLD": {} }, "NationalIDHT": { "NtionalIDData": { "NationalIDValues": { "NationalType": { "_text": "some value" }, "NationalIDNumber": { "_text": "some value" } } } }, "AssignmentHT": { "AssignmentData": { "Assignment": { "PersonNumber": { "_text": "some value" }, "PersonNumber_OLD": {}, "WorkerNumber": { "_text": "some value" }, "WorkerNumber_OLD": {}, "Gender": { "_text": "some value" }, "Gender_OLD": {}, "ActionName": { "_text": "some value" }, "ActionName_OLD": {}, "HourlySalaried": { "_text": "some value" }, "HourlySalaried_OLD": {}, "SalaryBasis": { "_text": "some value" }, "SalaryBasis_OLD": {}, "ManagerPersonNumber": { "_text": "some value" }, "ManagerPersonNumber_OLD": {}, "ManagerDisplayName": { "_text": "some value" }, "ManagerDisplayName_OLD": {}, "AssignmentCategory": { "_text": "some value" }, "AssignmentCategory_OLD": {}, "AsgState": { "_text": "some value" }, "AsgState_OLD": {}, "JobCode": { "_text": "some value" }, "JobCode_OLD": {}, "Desgination": { "_text": "some value" }, "Desgination_OLD": {}, "Grade": { "_text": "some value" }, "Grade_OLD": {}, "Levele-Grade": { "_text": "some value" }, "Levele-Grade_OLD": {}, "Department": { "_text": "some value" }, "Department_OLD": {}, "EmployeeType": { "_text": "some value" }, "EmployeeType_OLD": {}, "BusinessUnit": { "_text":"some value" }, "BusinessUnit_OLD": {}, "BaseLocation": { "_text":"some value" }, "BaseLocation_OLD": {}, "PhysicalWorkAddress": { "_text":"some value" } } } } };

const result = transformJson(originalJson);
console.log(JSON.stringify(result, null, 2));

代码关键点解释

  1. 递归遍历:函数会自动调用自己处理所有嵌套的子对象,不管JSON层级有多深都能覆盖到
  2. 空对象过滤:处理完子对象后,如果结果是空对象,就不会添加到父对象中,像Legal_Employee_Id和各种_OLD空对象都会被自动移除
  3. _text值提升:判断一个对象是否仅包含_text属性,如果是,就直接把_text的值替换掉原来的对象
  4. 数组兼容:代码提前处理了数组场景,万一你的JSON后续包含数组结构也能正常工作

运行结果

执行上述代码后,你会得到完全符合预期的JSON结构:

{
  "Changes_Only": "some value",
  "EmployeeData": {
    "OBJECT_ACTION_ID": "some value",
    "Employee": {
      "PersonID": "some value",
      "PersonNumber": "some value",
      "StartDate": "some value",
      "PersonType": "some value",
      "DateofBirth": "some value",
      "HireDate": "some value",
      "WorkEmail": "some value",
      "FirstName": "some value",
      "LastName": "some value"
    },
    "NationalIDHT": {
      "NtionalIDData": {
        "NationalIDValues": {
          "NationalType": "some value",
          "NationalIDNumber": "some value"
        }
      }
    },
    "AssignmentHT": {
      "AssignmentData": {
        "Assignment": {
          "PersonNumber": "some value",
          "WorkerNumber": "some value",
          "Gender": "some value",
          "ActionName": "some value",
          "HourlySalaried": "some value",
          "SalaryBasis": "some value",
          "ManagerPersonNumber": "some value",
          "ManagerDisplayName": "some value",
          "AssignmentCategory": "some value",
          "AsgState": "some value",
          "JobCode": "some value",
          "Desgination": "some value",
          "Grade": "some value",
          "Levele-Grade": "some value",
          "Department": "some value",
          "EmployeeType": "some value",
          "BusinessUnit": "some value",
          "BaseLocation": "some value",
          "PhysicalWorkAddress": "some value"
        }
      }
    }
  }
}

内容的提问来源于stack exchange,提问作者tarun nt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:23:01