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

递归函数遍历嵌套对象/数组找目标对象时返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:26:30