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

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;
}

关键修复点说明

  1. 局部变量隔离:用const声明items和value,确保每次递归调用都有独立的变量空间,不会互相覆盖。
  2. 数组/对象区分处理:初始化时判断输入是数组还是对象,后续分别用push或键值对赋值,完全保留原JSON的层级结构。
  3. 空值过滤:增加value !== null判断,避免把null误判为对象进行递归。

调用方式不变

const result = {"fields": createDatabase(jsonData)};
console.log(result);

现在输出会和原JSON的嵌套结构完全一致,满足构建数据库schema的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 10:13:30