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

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

代码逻辑说明

  1. 数组存储结果:用数组替代字符串,支持同时存储多个子键,不会出现覆盖问题
  2. 精准匹配目标键:直接检查当前键是否为$search,确保不会漏掉任何层级的匹配项
  3. 递归合并结果:遇到嵌套对象时,递归调用函数并将返回的子键数组合并到主结果中
  4. 边界处理:排除null值(因为typeof null会返回object,但我们不需要处理null)

这样就能完美遍历所有嵌套层级的对象,收集到所有$search下的子键啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:19:48