JavaScript遍历嵌套对象,提取所有$search下的子键
解决方案:提取嵌套对象中所有
$search的子键 我来帮你搞定这个问题!你的核心需求是遍历所有嵌套层级的对象,收集所有$search键对应的子键,但原代码只拿到了第一个匹配项,问题出在结果存储和递归逻辑上。
原代码的问题分析
- 用字符串
result存储结果:每次找到匹配项会直接覆盖之前的值,无法累加多个结果 - 递归调用未收集返回值:调用
search(obj[keys], id)时,没有把递归得到的结果合并到主结果里 - 判断逻辑不够精准:间接通过
obj[keys][id] !== undefined判断,容易漏掉深层嵌套的$search
修正后的代码
下面是能完整遍历所有嵌套对象、收集全部目标子键的实现:
function collectSearchKeys(obj, targetKey = '$search') { // 用数组存储结果,避免覆盖,方便累加多个子键 const result = []; // 遍历对象的每个属性 for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; // 找到目标$search键,提取它的所有子键 if (key === targetKey && typeof value === 'object' && value !== null) { result.push(...Object.keys(value)); } // 如果当前值是对象(排除null,因为typeof null === 'object'),递归遍历深层结构 else if (typeof value === 'object' && value !== null) { // 把递归返回的结果合并到当前数组 result.push(...collectSearchKeys(value, targetKey)); } } } return result; } // 测试你的目标对象 let obj = { _id: {}, person: { $search: { lname: true }, _id: {}, fname: {}, something:{ $search: { fname: true }, } }, code: {}, $search: { mname: true }, vnvEmpName: {} }; // 调用函数并输出空格分隔的结果 console.log(collectSearchKeys(obj).join(' ')); // 输出:lname fname mname
代码逻辑说明
- 数组存储结果:用数组替代字符串,支持同时存储多个子键,不会出现覆盖问题
- 精准匹配目标键:直接检查当前键是否为
$search,确保不会漏掉任何层级的匹配项 - 递归合并结果:遇到嵌套对象时,递归调用函数并将返回的子键数组合并到主结果中
- 边界处理:排除
null值(因为typeof null会返回object,但我们不需要处理null)
这样就能完美遍历所有嵌套层级的对象,收集到所有$search下的子键啦!
内容的提问来源于stack exchange,提问作者ra_pri
相关产品推荐
相关产品推荐

