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"]
函数说明
- 递归遍历:函数会深入到对象的每一个嵌套层级,不会遗漏任何一个
$search区块 - 健壮性处理:加入了对
$search值是否为对象的判断,避免如果$search是其他类型(比如字符串、数字)时出现报错 - 结果收集:通过
push(...Object.keys())和concat()来合并所有层级的结果,确保不会丢失任何键
内容的提问来源于stack exchange,提问作者ra_pri
相关产品推荐
相关产品推荐

