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

deepFilter函数实现求助:深层过滤对象结果不符合预期

deepFilter函数层级结构丢失问题排查与修复

你的问题核心是递归过程中复用了同一个结果对象,导致所有符合过滤条件的键都被直接挂载到顶层,完全丢失了原有的嵌套结构。

原代码的问题分析

你在函数参数里传入了resultObj,并且所有递归层级都往同一个resultObj里添加键值对——比如处理b.c时,直接把c:2放到了最外层的resultObj,而不是b对应的子对象中,最终所有符合条件的键都被打平成了平级结构。

修复思路

每一层递归处理对象时,都要创建独立的新对象来存储当前层级的过滤结果:

  1. 遇到非对象类型(包括null,因为typeof null === 'object'),直接用过滤函数判断,符合条件返回原值,否则返回undefined(表示不保留该值)
  2. 处理对象时,先创建空对象,遍历其所有属性,递归处理每个属性值
  3. 只有当递归返回的结果不是undefined时,才把该键值对添加到当前层级的新对象中
  4. 处理完当前对象后,如果新对象为空(所有子属性都被过滤掉了),则返回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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:40:16