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; };
核心问题有两个:
- 递归调用时没有判断子分支是否找到目标,无论子分支返回什么都直接赋值给
result。比如在sub_group1_1分支找到目标值后,循环继续遍历后续的sub_group1_2、group2分支,这些分支递归搜索不到目标会返回空对象,直接覆盖了之前找到的正确结果 - 找到目标后只break了当前层的循环,没有把「已找到结果」的状态传递到上层递归,上层遍历会继续执行
- 缺少边界判断:
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
相关产品推荐
相关产品推荐

