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

嵌套对象空值键过滤异常:递归方法未处理嵌套层级

如何递归过滤对象中值为空字符串的键(含嵌套对象)

问题场景

我需要过滤对象中值为空字符串('')的键,嵌套对象内的空值键也需一并过滤。但当前的TypeScript方法仅能处理父级对象的空值键,嵌套对象里的空值键无法被过滤。

输入示例

const obje = {
  a:'a',
  b:'',
  c:'c',
  d: {
    e:'e',
    f:'',
    g:'',
    h:''
  }
}

期望输出

const obje = {
  a:'a',
  c:'c',
  d: {
    e:'e',
  }
}

当前代码及问题

filterKeys(obj: any) {
  return Object.fromEntries(
    Object.entries(obj).filter(([key, value]) => {
      return typeof value !== 'object'
        ? value !== ''
        : this.filterKeys(obj[key]);
    }),
  );
}

实际输出的嵌套对象仍保留空值键:

const obje = {
  a:'a',
  c:'c',
  d: {
    e:'e',
    f:'',
    g:'',
    h:''
  }
}

问题原因分析

  1. 递归逻辑错误:处理嵌套对象时,filter回调返回了递归后的对象(而非布尔值)。filter需要布尔值判断是否保留当前键,因此只要嵌套对象不为空,就会保留原对象,而非替换成过滤后的版本。
  2. 未处理null边界:typeof null === 'object',若值为null会错误进入递归流程。
  3. 参数误用:递归时使用obj[key]而非直接用value,写法不严谨。

修正后的代码

filterKeys(obj: any): any {
  // 边界处理:非对象/直接返回原值
  if (typeof obj !== 'object' || obj === null) {
    return obj;
  }

  return Object.fromEntries(
    Object.entries(obj)
      // 第一步:过滤空字符串,同时判断嵌套对象过滤后是否需保留
      .filter(([_, value]) => {
        if (value === '') return false;
        if (typeof value === 'object' && value !== null) {
          const filteredNested = this.filterKeys(value);
          // 若过滤后嵌套对象为空,可选择不保留该键(按需调整)
          return Object.keys(filteredNested).length > 0;
        }
        return true;
      })
      // 第二步:替换嵌套对象为过滤后的版本
      .map(([key, value]) => {
        if (typeof value === 'object' && value !== null) {
          return [key, this.filterKeys(value)];
        }
        return [key, value];
      })
  );
}

修正说明

  1. 边界判断:先排除非对象和null的情况,避免递归出错。
  2. 拆分逻辑:先通过filter剔除空字符串键,对嵌套对象先递归过滤,再决定是否保留该键(若过滤后嵌套对象为空,会自动剔除)。
  3. 替换嵌套对象:通过map将原嵌套对象替换为过滤后的版本,确保内层空值键被处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 08:35:03