删除JavaScript对象空值属性时触发Cannot convert undefined或null转对象错误如何解决
问题原因与解决方案
错误触发根源
你的报错和对象原型没有任何关联,是属性访问的语法使用错误导致的:
在JavaScript中,点语法obj.key会将key作为固定的字面量属性名读取,而非你for循环中声明的迭代变量key。你的测试对象中不存在名为key的属性,因此obj.key返回undefined,将undefined传入Object.keys方法就会触发你遇到的类型报错。
修复方案
1. 基础修正(仅修改属性访问语法)
将点语法替换为支持变量的方括号语法obj[key],同时增加前置类型校验,避免属性值为非对象/ null时调用Object.keys报错:
for (const key in obj) { // hasOwnProperty用于排除原型链继承的属性,仅处理对象自身挂载的属性 if (obj.hasOwnProperty(key) && typeof obj[key] === 'object' && obj[key] !== null) { if (Object.keys(obj[key]).length === 0) { delete obj[key]; } } }
运行后测试对象中的empty属性会被正常删除。
2. 可选扩展:递归删除嵌套的空对象
如果需要处理嵌套层级里的空对象,可以用递归逻辑实现:
function removeEmptyObjects(obj) { for (const key in obj) { if (obj.hasOwnProperty(key) && typeof obj[key] === 'object' && obj[key] !== null) { // 先递归处理子属性 removeEmptyObjects(obj[key]); // 子属性处理完如果是空对象就删除 if (Object.keys(obj[key]).length === 0) { delete obj[key]; } } } return obj; } // 调用方法 removeEmptyObjects(obj);
内容的提问来源于stack exchange,提问作者ifinley
相关产品推荐
相关产品推荐

