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

递归对象转换JS工具开发求助:嵌套结构空值处理异常

递归转换对象与数组的工具函数修正方案

需求说明

  • 接收原生普通对象作为输入,递归遍历至最深层级,数组需遍历每个元素
  • 按以下规则转换每个值:
    1. null/undefined → "NULL_VALUE"
    2. 空字符串"" → "EMPTY_VALUE"
    3. 空数组[] → "EMPTY_ARRAY"
    4. 空对象{} → "EMPTY_OBJECT"
    5. 其他值 → "VALID_VALUE"

示例输入

const input = {
  a: null,
  b: "",
  c: [],
  d: {},
  e: "hello",
  f: [null, "", [], {}, "world"],
  g: {
    h: null,
    i: "",
    j: [],
    k: {},
    l: "nested",
  },
};

预期输出

{
  a: "NULL_VALUE",
  b: "EMPTY_VALUE",
  c: "EMPTY_ARRAY",
  d: "EMPTY_OBJECT",
  e: "VALID_VALUE",
  f: ["NULL_VALUE", "EMPTY_VALUE", "EMPTY_ARRAY", "EMPTY_OBJECT", "VALID_VALUE"],
  g: {
    h: "NULL_VALUE",
    i: "EMPTY_VALUE",
    j: "EMPTY_ARRAY",
    k: "EMPTY_OBJECT",
    l: "VALID_VALUE",
  },
}

原代码问题分析

原代码的核心问题是递归处理对象/数组后,未对空对象/空数组执行最终转换:

  • 在transformArray中,处理空对象/空数组时,递归调用后直接返回原结构(空对象{}或空数组[]),没有经过transformValue的判断转换
  • 仅顶层的空对象/空数组会被transformValue处理,但嵌套在数组中的空对象/空数组会被遗漏

修正后的代码

我们可以将所有逻辑整合到一个递归函数中,确保每个值(包括深层嵌套的空对象/空数组)都能被正确判断转换:

// 辅助函数:判断是否为原生普通对象
const isPlainObject = (value) => {
  return typeof value === 'object' && value !== null && Object.prototype.toString.call(value) === '[object Object]';
};

const transform = (value) => {
  // 处理null/undefined
  if (value === null || value === undefined) {
    return "NULL_VALUE";
  }
  // 处理空字符串
  if (typeof value === 'string' && value === "") {
    return "EMPTY_VALUE";
  }
  // 处理数组
  if (Array.isArray(value)) {
    if (value.length === 0) {
      return "EMPTY_ARRAY";
    }
    return value.map(item => transform(item));
  }
  // 处理普通对象
  if (isPlainObject(value)) {
    const keys = Object.keys(value);
    if (keys.length === 0) {
      return "EMPTY_OBJECT";
    }
    const result = {};
    for (const key of keys) {
      result[key] = transform(value[key]);
    }
    return result;
  }
  // 其他所有情况统一返回VALID_VALUE
  return "VALID_VALUE";
};

// 使用示例
const input = {
  a: null,
  b: "",
  c: [],
  d: {},
  e: "hello",
  f: [null, "", [], {}, "world"],
  g: {
    h: null,
    i: "",
    j: [],
    k: {},
    l: "nested",
  },
};

console.log(transform(input));

代码说明

  1. 单一递归入口:所有类型的值都通过transform函数处理,避免逻辑分散
  2. 优先级判断:按需求顺序依次判断值类型,确保空值、空字符串优先被处理
  3. 空结构直接转换:遇到空数组/空对象时直接返回对应字符串,无需递归遍历
  4. 深层嵌套处理:数组元素和对象属性均递归调用transform,确保所有层级的 value 都符合转换规则

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 02:06:01