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

