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

JavaScript递归清理对象函数报错:Cannot convert undefined or null to object 求助

解决递归清理对象无效值时的「Cannot convert undefined or null to object」错误

我来帮你排查并修复这个问题:

错误根源

你遇到的报错核心原因是**typeof null的返回值是'object'**,而你的目标对象里恰好有youtubeLink: null这个属性。当递归函数处理到它时,会进入else if (typeof obj[key] === 'object')分支,调用rec(null)。在rec(null)的执行过程中,Object.keys(obj)尝试对null调用,自然就抛出了「Cannot convert undefined or null to object」的错误。

除此之外,你的函数还有几个潜在的逻辑漏洞:

  • 没有提前处理null/undefined这类特殊值,导致它们被误当成普通对象进入递归
  • 数组和普通对象的边界处理模糊,空数组可能被误判为空对象删除
  • 直接遍历Object.keys(obj)时,中途删除属性会打乱遍历顺序,导致部分键被遗漏

修复后的递归函数

function rec(obj) {
  // 提前处理null/undefined,直接标记为无效值
  if (obj === null || obj === undefined) {
    return null;
  }

  // 数组单独处理:递归清理每个元素,再过滤无效值
  if (Array.isArray(obj)) {
    return obj.map(item => rec(item)).filter(val => {
      // 自定义无效值规则:可根据需求调整
      if (val === null || val === undefined || val === '') return false;
      if (typeof val === 'object' && Object.keys(val).length === 0) return false;
      return true;
    });
  }

  // 普通对象处理:先复制键列表,避免删除属性影响遍历
  const keys = [...Object.keys(obj)];
  for (let key of keys) {
    const value = obj[key];

    // 空字符串直接删除
    if (value === '') {
      delete obj[key];
      continue;
    }

    // 递归处理子对象/数组
    if (typeof value === 'object') {
      const processedVal = rec(value);
      // 处理后如果是无效值(空对象/数组、null等),删除当前键
      if (processedVal === null || 
          (typeof processedVal === 'object' && Object.keys(processedVal).length === 0)) {
        delete obj[key];
      } else {
        obj[key] = processedVal;
      }
    }

    // 布尔值、数字等基础类型直接保留
  }

  return obj;
}

效果验证

用你提供的Object11对象测试这个函数:

  • 会自动删除flash: ''、meta(处理后变为空对象)、空数组subCategory: []等无效内容
  • 保留refundAble: false、price: 23235这类有效非空值
  • 彻底避免了null引发的类型错误

你可以根据业务需求,调整filter里的无效值判断规则,比如是否要保留0、false这类特殊值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 14:17:36