递归对象转换JS工具开发求助:嵌套结构空值处理异常
递归转换对象与数组的工具函数修正方案
需求说明
- 接收原生普通对象作为输入,递归遍历至最深层级,数组需遍历每个元素
- 按以下规则转换每个值:
- null/undefined →
"NULL_VALUE" - 空字符串
""→"EMPTY_VALUE" - 空数组
[]→"EMPTY_ARRAY" - 空对象
{}→"EMPTY_OBJECT" - 其他值 →
"VALID_VALUE"
- null/undefined →
示例输入
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));
代码说明
- 单一递归入口:所有类型的值都通过
transform函数处理,避免逻辑分散 - 优先级判断:按需求顺序依次判断值类型,确保空值、空字符串优先被处理
- 空结构直接转换:遇到空数组/空对象时直接返回对应字符串,无需递归遍历
- 深层嵌套处理:数组元素和对象属性均递归调用
transform,确保所有层级的 value 都符合转换规则
内容的提问来源于stack exchange,提问作者adme
相关产品推荐
相关产品推荐

