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

ES6如何根据搜索词过滤深度嵌套对象?

从嵌套对象中过滤保留匹配指定搜索词的节点

需求说明

有一个多层嵌套的对象,需要生成新对象,只保留包含指定搜索词my search term的节点,同时保留这些节点的完整父级路径,移除所有不匹配的节点。

实现思路

用递归遍历对象的每一层:

  • 若当前节点是对象,遍历所有子键,对每个子节点递归执行过滤逻辑
  • 只有当子节点本身匹配搜索词,或子节点的后代中有匹配节点时,才保留当前键值对
  • 若当前节点是普通值,直接判断是否等于搜索词,是则保留,否则丢弃

代码实现

function filterObjectBySearchTerm(obj, searchTerm) {
  // 处理非对象的情况(比如直接是匹配的字符串)
  if (typeof obj !== 'object' || obj === null) {
    return obj === searchTerm ? obj : undefined;
  }

  const filtered = {};
  // 遍历对象的每个键
  for (const key in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, key)) {
      const value = obj[key];
      // 递归处理子节点
      const filteredValue = filterObjectBySearchTerm(value, searchTerm);
      // 如果处理后的子节点有内容,就保留这个键
      if (filteredValue !== undefined) {
        // 跳过空对象,避免结构中残留空节点
        if (typeof filteredValue === 'object' && Object.keys(filteredValue).length === 0) {
          continue;
        }
        filtered[key] = filteredValue;
      }
    }
  }

  // 过滤后的对象为空则返回undefined,上层会跳过这个键
  return Object.keys(filtered).length > 0 ? filtered : undefined;
}

// 原对象
const originalObj = {
    grandParent1: {
        parent1: {
            child1: {
                grandChild1: {
                    name: 'my search term'
                },
                grandChild2: {
                    name: 'not my search term'
                },
                grandChild3: {
                    name: 'not my search term either'
                },
            },
            child2: {
                grandChild1: {
                    name: 'my search term'
                },
                grandChild2: {
                    name: 'not my search term'
                }
            }
        },
        parent2: {
            child1: {
                name: 'my search term'
            }
        },
        parent3: {
            name: 'my search term'
        }
    }
};

// 执行过滤
const result = filterObjectBySearchTerm(originalObj, 'my search term');
console.log(result);

输出结果

执行代码后得到的结果与期望一致:

{
    grandParent1: {
        parent1: {
            child1: {
                grandChild1: {
                    name: 'my search term'
                }
            },
            child2: {
                grandChild1: {
                    name: 'my search term'
                }
            }
        },
        parent2: {
            child1: {
                name: 'my search term'
            }
        },
        parent3: {
            name: 'my search term'
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:42:35