递归函数遍历嵌套对象/数组找目标对象时返回undefined问题求助
解决递归查找嵌套对象返回undefined的问题
这种情况我之前踩过一模一样的坑!问题核心在于递归调用时没有正确传递返回值——你大概率是在深层找到目标对象后直接return,但上层的递归函数并没有接收这个返回结果,导致它们执行到最后默认返回undefined,而console.log是在找到目标的那一层直接输出,所以能看到正确值。
先看你可能写出的错误代码示例:
function findObjByKey(obj, targetKey) { if (Array.isArray(obj)) { for (let item of obj) { // 只调用递归,但没把返回值传回去 findObjByKey(item, targetKey); } } else if (typeof obj === 'object' && obj !== null) { if (obj.hasOwnProperty(targetKey)) { console.log(obj); // 这里能正确输出目标对象 return obj; } for (let key in obj) { // 同样只调用,没处理返回值 findObjByKey(obj[key], targetKey); } } // 没找到时默认返回undefined }
修正后的代码:
关键是每次递归调用时接收返回结果,一旦找到目标就立刻向上传递return:
function findObjByKey(obj, targetKey) { // 处理数组情况:遍历每个元素递归查找 if (Array.isArray(obj)) { for (let item of obj) { const result = findObjByKey(item, targetKey); // 如果找到结果,直接返回给上层 if (result) { return result; } } } // 处理对象情况(排除null) else if (typeof obj === 'object' && obj !== null) { // 先检查当前对象是否包含目标key if (obj.hasOwnProperty(targetKey)) { return obj; } // 遍历对象的所有属性值继续递归 for (let key in obj) { const result = findObjByKey(obj[key], targetKey); if (result) { return result; } } } // 没找到时返回null(也可以返回undefined,根据你的需求调整) return null; }
为什么这个修正有效?
当深层递归找到目标对象并return时,这个返回值会被上层的result变量接收,然后上层函数立刻把这个result return出去,一层一层往上传递,直到最外层调用的函数拿到最终结果。而之前的错误写法里,上层函数根本没管递归调用的返回值,执行完循环后就走到了函数末尾,默认返回undefined。
测试一下:
const testNestedData = [ { id: 1, children: [{ id: 2, targetKey: 'I am target', value: 'test' }] }, { id: 3, nested: { deeper: { key: 'not target' } } } ]; const targetObj = findObjByKey(testNestedData, 'targetKey'); console.log(targetObj); // 输出 { id: 2, targetKey: 'I am target', value: 'test' }
内容的提问来源于stack exchange,提问作者Hovadko
相关产品推荐
相关产品推荐

