deepFilter函数实现求助:深层过滤对象结果不符合预期
deepFilter函数层级结构丢失问题排查与修复
你的问题核心是递归过程中复用了同一个结果对象,导致所有符合过滤条件的键都被直接挂载到顶层,完全丢失了原有的嵌套结构。
原代码的问题分析
你在函数参数里传入了resultObj,并且所有递归层级都往同一个resultObj里添加键值对——比如处理b.c时,直接把c:2放到了最外层的resultObj,而不是b对应的子对象中,最终所有符合条件的键都被打平成了平级结构。
修复思路
每一层递归处理对象时,都要创建独立的新对象来存储当前层级的过滤结果:
- 遇到非对象类型(包括
null,因为typeof null === 'object'),直接用过滤函数判断,符合条件返回原值,否则返回undefined(表示不保留该值) - 处理对象时,先创建空对象,遍历其所有属性,递归处理每个属性值
- 只有当递归返回的结果不是
undefined时,才把该键值对添加到当前层级的新对象中 - 处理完当前对象后,如果新对象为空(所有子属性都被过滤掉了),则返回
undefined,上层就不会保留这个空的父对象(比如原示例中的e对象,所有子属性都不符合条件,最终会被丢弃)
修正后的代码
function deepFilter(obj, filter) { // 处理非对象类型(含null) if (typeof obj !== 'object' || obj === null) { return filter(obj) ? obj : undefined; } const currentResult = {}; for (const key in obj) { if (obj.hasOwnProperty(key)) { const filteredValue = deepFilter(obj[key], filter); // 仅保留过滤后有效的值 if (filteredValue !== undefined) { currentResult[key] = filteredValue; } } } // 如果当前层级没有有效属性,返回undefined让上层丢弃这个空对象 return Object.keys(currentResult).length > 0 ? currentResult : undefined; }
测试验证
调用示例:
const obj = { a: 1, b: { c: 2, d: -3, e: { f: { g: -4, }, }, h: { i: 5, j: 6, }, } }; const filter = (n) => n >= 0; console.log(deepFilter(obj, filter));
输出结果与预期完全一致:
{ a: 1, b: { c: 2, h: { i: 5, j: 6 } } }
内容的提问来源于stack exchange,提问作者Chaitanya
相关产品推荐
相关产品推荐

