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

Node.js中在嵌套对象内检索$search下的所有属性

遍历嵌套对象收集所有$search内的键

嗨,我来帮你搞定这个需求!你想要从嵌套的JavaScript对象里找出所有$search区块中的属性键,不管$search在哪个层级对吧?我先分析下你现有代码的问题,再给你一个可行的实现方案。


你的现有代码问题

你之前写的findById函数是用来查找特定id的对象,但你的需求是收集所有$search下的键,所以这个函数的方向不太对。它会在找到第一个匹配对象后直接返回,没办法收集所有层级的结果,而且逻辑里的obj.id === id也不符合你要找$search的需求。


正确的实现方案

我们可以写一个递归函数,遍历对象的每一个属性:

  • 当遇到属性名为$search时,提取这个对象的所有键并收集起来
  • 如果遇到的属性值是嵌套对象(排除null,因为typeof null也会返回object),就继续递归遍历这个子对象

以下是完整的代码:

function collectSearchKeys(obj) {
  // 初始化数组存储所有找到的键
  let resultKeys = [];

  // 遍历当前对象的所有属性
  for (const prop in obj) {
    // 检查当前属性是否是$search
    if (prop === '$search') {
      // 确保$search的值是对象,避免非对象类型导致报错
      if (typeof obj[prop] === 'object' && obj[prop] !== null) {
        // 把$search内的所有键添加到结果数组
        resultKeys.push(...Object.keys(obj[prop]));
      }
    } 
    // 如果当前属性值是嵌套对象,递归处理
    else if (typeof obj[prop] === 'object' && obj[prop] !== null) {
      // 合并递归返回的结果
      resultKeys = resultKeys.concat(collectSearchKeys(obj[prop]));
    }
  }

  return resultKeys;
}

测试示例

用你提供的第二个对象来测试:

let obj = { 
  _id: {}, 
  person: { 
    $search: { lname: true }, 
    _id: {}, 
    fname: {}, 
    something:{ 
      $search: { fname: true }, 
    } 
  }, 
  code: {}, 
  $search: { mname: true }, 
  vnvEmpName: {}
};

// 调用函数并打印结果
console.log(collectSearchKeys(obj)); // 输出: ["lname", "fname", "mname"]

函数说明

  1. 递归遍历:函数会深入到对象的每一个嵌套层级,不会遗漏任何一个$search区块
  2. 健壮性处理:加入了对$search值是否为对象的判断,避免如果$search是其他类型(比如字符串、数字)时出现报错
  3. 结果收集:通过push(...Object.keys())和concat()来合并所有层级的结果,确保不会丢失任何键

内容的提问来源于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:17:26