判断嵌套对象属性是否有值的函数对Date类型失效的原因与解决
问题分析与解决:修复能识别Date类型的hasValue函数
问题原因
原函数处理Date类型失效的核心逻辑问题:
typeof new Date()返回值是"object",会触发递归调用hasValue(value)遍历Date对象的属性- 但Date实例的自身可枚举属性默认是空的(for...in循环找不到任何属于Date自身的属性),递归遍历Date时直接返回false,导致整个函数错误判定该Date为“无有效值”
解决方法
修改思路:在递归处理对象类型的值前,先做两个关键判断:
- 排除
null(因为typeof null也等于"object",但null不属于有效值) - 如果是Date实例,直接认定为有有效值,返回
true
修改后的代码如下:
function hasValue(obj) { for (const key in obj) { if (obj.hasOwnProperty(key)) { const value = obj[key]; if (typeof value === "object") { // 过滤null,避免递归报错 if (value === null) { continue; } // 识别Date实例,直接返回true if (value instanceof Date) { return true; } // 递归处理其他对象/数组 if (hasValue(value)) { return true; } } else if (value) { return true; } } } return false; }
验证测试
用你提供的model对象测试:
const model = { criteria: "", category: "", range: { start: { a: [new Date()] }, end: new Date(), }, }; console.log(hasValue(model)); // 输出true,符合预期
内容的提问来源于stack exchange,提问作者Mario
相关产品推荐
相关产品推荐

