JavaScript递归函数返回值被覆盖:无法完整复刻JSON结构求助
修复递归函数以保留嵌套JSON结构
你的递归函数有两个核心问题导致无法保留原嵌套结构:
- 变量未声明为局部变量:
items = {}和topic = data[field]都没加let/const,属于全局变量。每次递归调用时都会覆盖之前的items,最终只剩最内层递归的结果。 - 未区分普通对象和数组:
typeof []的结果也是"object",数组会被当成普通对象递归处理,转成带数字键的对象,破坏了原结构。
修复后的代码
function createDatabase(data) { // 根据输入类型初始化对应结构,数组用[],对象用{} const items = Array.isArray(data) ? [] : {}; for (const field in data) { const value = data[field]; // 排除null,因为typeof null也返回"object" if (typeof value === "object" && value !== null) { // 数组用push,对象用键值对赋值,递归处理嵌套结构 if (Array.isArray(items)) { items.push(createDatabase(value)); } else { items[field] = createDatabase(value); } } else { // 非对象类型直接添加到对应结构中 if (Array.isArray(items)) { items.push(value); } else { items[field] = value; } } } return items; }
关键修复点说明
- 局部变量隔离:用
const声明items和value,确保每次递归调用都有独立的变量空间,不会互相覆盖。 - 数组/对象区分处理:初始化时判断输入是数组还是对象,后续分别用
push或键值对赋值,完全保留原JSON的层级结构。 - 空值过滤:增加
value !== null判断,避免把null误判为对象进行递归。
调用方式不变
const result = {"fields": createDatabase(jsonData)}; console.log(result);
现在输出会和原JSON的嵌套结构完全一致,满足构建数据库schema的需求。
内容的提问来源于stack exchange,提问作者iamlc
相关产品推荐
相关产品推荐

