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

JavaScript深度嵌套对象按key查找值的递归函数异常排查

深度嵌套对象指定Key搜索实现问题

基础定义

JavaScript中定义的深度嵌套对象结构如下:

const obj = {
  "group1": {
    "sub_group1_1": {
      "inner_sub_group1_1_1": {
        "name": "abc"
      },
      "inner_sub_group1_1_2": {
        "name": "def"
      }
    },
    "sub_group1_2": {
      "inner_sub_group1_2_1": {
        "name": "ghi"
      },
      "inner_sub_group1_2_2": {
        "name": "jkl" 
      }
    }
  },
  "group2": {
    "sub_group2_1": {
      "inner_sub_group2_1_1": {
        "name": "mno"
      },
      "inner_sub_group2_1_2": {
        "name": "pqr"
      }
    },
    "sub_group2_2": {
      "inner_sub_group2_2_1": {
        "name": "stu"
      },
      "inner_sub_group2_2_2": {
        "name": "wxy" 
      }
    }
  }
}

需求为实现一个函数,在上述嵌套对象中搜索指定key并返回对应的值,预期效果:

  • 测试用例1
    输入:
    filterObject(obj, 'inner_sub_group2_2_2')
    
    输出:
    {
      "name": "wxy"
    }
    
  • 测试用例2
    输入:
    filterObject(obj, 'inner_sub_group1_1_1')
    
    输出:
    {
      "name": "abc"
    }
    

原有代码问题分析

自行实现的递归函数无法正确返回第二个测试场景结果,原代码如下:

const filterObject = (obj, searchedKey) => {
  let result = {};
  for (const key in obj) {
    const currentObj = obj[key];
    if (key === searchedKey) {
      result = currentObj;
      break;
    } else if (typeof currentObj === 'object') {
      result = filterObject(currentObj, searchedKey);
    }
  }
  return result;
};

核心问题有两个:

  1. 递归调用时没有判断子分支是否找到目标,无论子分支返回什么都直接赋值给result。比如在sub_group1_1分支找到目标值后,循环继续遍历后续的sub_group1_2、group2分支,这些分支递归搜索不到目标会返回空对象,直接覆盖了之前找到的正确结果
  2. 找到目标后只break了当前层的循环,没有把「已找到结果」的状态传递到上层递归,上层遍历会继续执行
  3. 缺少边界判断:typeof null === 'object',如果对象中存在null值会触发递归报错

正确实现方案

递归搜索时只要拿到非空的匹配结果就直接返回,终止后续遍历,避免结果被覆盖:

const filterObject = (obj, searchedKey) => {
  for (const key in obj) {
    const currentVal = obj[key];
    // 当前层key匹配直接返回对应值
    if (key === searchedKey) return currentVal;
    // 仅当值为非null对象时才递归搜索
    if (typeof currentVal === 'object' && currentVal !== null) {
      const matchRes = filterObject(currentVal, searchedKey);
      // 子分支找到结果直接返回,不继续后续遍历
      if (matchRes !== undefined) return matchRes;
    }
  }
  // 遍历完所有节点无匹配返回undefined,需要空对象返回可改为 return {}
  return undefined;
};

说明:用undefined作为未匹配的标记更合理,可以区分「未找到key」和「找到的key对应值本身是空对象」两种场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 06:12:21