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

递归提取JSON指定嵌套字段生成新数组问题求助

递归提取JSON中指定数组的客户字段返回空数组的排查与解决

问题分析

递归函数返回空数组,通常是以下几种原因导致:

  • 递归过程中未正确复用结果集合,每次递归都创建新数组导致数据丢失
  • 目标key或客户字段的拼写与JSON中的实际字段不匹配
  • 递归逻辑未覆盖嵌套结构(比如对象里的目标数组、数组中的嵌套对象)
  • 未正确判断目标key对应的数组类型,导致跳过了数据提取

修正后的递归实现

以下是修复后的递归函数,能够正确定位指定key的数组并提取目标字段,同时处理嵌套结构:

function extractCustomerData(data, targetKey, result = []) {
    // 处理数组:遍历每个元素递归处理
    if (Array.isArray(data)) {
        data.forEach(item => extractCustomerData(item, targetKey, result));
        return result;
    }

    // 处理非空对象
    if (typeof data === 'object' && data !== null) {
        // 检查当前对象是否包含目标key,且对应值为数组
        if (data[targetKey] && Array.isArray(data[targetKey])) {
            data[targetKey].forEach(customer => {
                // 提取字段,兼容字段不存在的情况
                result.push({
                    name: customer.customerName || '',
                    address: customer.customerAddress || '',
                    age: customer.customerAge || ''
                });
            });
        }
        // 遍历对象所有属性值,递归处理嵌套结构
        Object.values(data).forEach(value => extractCustomerData(value, targetKey, result));
        return result;
    }

    // 非对象/数组类型直接返回结果
    return result;
}

多key测试验证

用多嵌套、多目标key的测试数据验证函数效果:

// 多嵌套、多目标key的测试数据
const testData = {
    code: 200,
    msg: 'success',
    data: [
        {
            customerName: '张三',
            customerAddress: '北京市朝阳区',
            customerAge: 30,
            extra: '无关字段'
        }
    ],
    nested: {
        data: [
            {
                customerName: '李四',
                customerAddress: '上海市浦东新区',
                customerAge: 25,
                subData: {
                    // 嵌套更深的目标数组
                    data: [
                        {
                            customerName: '王五',
                            customerAddress: '广州市天河区',
                            customerAge: 35
                        }
                    ]
                }
            }
        ],
        otherKey: [
            {
                customerName: '赵六',
                customerAddress: '深圳市南山区',
                customerAge: 28
            }
        ]
    }
};

// 提取所有key为'data'的数组中的客户数据
const customerList = extractCustomerData(testData, 'data');
console.log(customerList);

执行后输出符合预期:

[
    { name: '张三', address: '北京市朝阳区', age: 30 },
    { name: '李四', address: '上海市浦东新区', age: 25 },
    { name: '王五', address: '广州市天河区', age: 35 }
]

排查步骤(针对你的原函数)

如果要排查自己的代码问题,可以按以下步骤检查:

  1. 检查结果数组的传递:确保递归时复用同一个结果数组,不要在递归调用内部重新初始化空数组(比如避免return [...result, ...recurse()]这种可能丢失数据的写法,或者用引用传递的方式维护结果)
  2. 字段拼写验证:确认targetKey、customerName、customerAddress、customerAge的拼写与JSON数据完全一致(注意大小写、下划线/驼峰的差异)
  3. 添加调试日志:在递归函数中加入console.log,打印当前处理的data、targetKey,查看是否遍历到了目标数组
  4. 类型判断逻辑:检查是否正确判断了数组和对象类型,比如是否遗漏了data !== null的判断(因为null的typeof也是object)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 13:10:28