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
相关产品推荐
相关产品推荐

