递归提取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 } ]
排查步骤(针对你的原函数)
如果要排查自己的代码问题,可以按以下步骤检查:
- 检查结果数组的传递:确保递归时复用同一个结果数组,不要在递归调用内部重新初始化空数组(比如避免
return [...result, ...recurse()]这种可能丢失数据的写法,或者用引用传递的方式维护结果) - 字段拼写验证:确认
targetKey、customerName、customerAddress、customerAge的拼写与JSON数据完全一致(注意大小写、下划线/驼峰的差异) - 添加调试日志:在递归函数中加入
console.log,打印当前处理的data、targetKey,查看是否遍历到了目标数组 - 类型判断逻辑:检查是否正确判断了数组和对象类型,比如是否遗漏了
data !== null的判断(因为null的typeof也是object)
内容的提问来源于stack exchange,提问作者Zak
相关产品推荐
相关产品推荐

