如何检测JavaScript动态键对象中是否存在Date实例
检查嵌套对象中是否存在Date实例(支持动态键)
要解决这个问题,我们需要递归遍历对象的所有嵌套属性,逐个检查是否存在Date实例——不管嵌套对象的键是不是动态的,这种方法都能完美覆盖场景。
核心实现思路
- 首先检查当前值是否是
Date实例,是的话直接返回true。 - 如果当前值是对象(且不为
null,因为typeof null会返回object),就遍历它的所有自身可枚举键,递归检查每个键对应的值。 - 只要在任意嵌套层级找到
Date实例,就立刻返回true;遍历完所有属性都没找到的话返回false。
基础版函数(仅处理对象)
function hasDateInstance(obj) { // 检查当前值是否为 Date 实例 if (obj instanceof Date) { return true; } // 处理非 null 的对象,递归遍历所有属性 if (typeof obj === 'object' && obj !== null) { // 遍历对象的所有自身可枚举键(不管键名是固定还是动态) for (const key of Object.keys(obj)) { if (hasDateInstance(obj[key])) { return true; } } } // 没有找到 Date 实例 return false; }
测试示例
测试你的原始对象(无Date实例)
var obj = { a: { username: 'xyz', picture: { value: "", id: "", }, }, }; console.log(hasDateInstance(obj)); // 输出: false
测试添加Date实例的情况
// 给动态键的picture对象添加一个Date属性 obj.a.picture.createdAt = new Date(); console.log(hasDateInstance(obj)); // 输出: true
进阶版:支持数组场景
如果你的对象中可能包含数组,也可以扩展函数来处理数组元素:
function hasDateInstance(obj) { // 优先检查是否为 Date 实例 if (obj instanceof Date) { return true; } // 处理数组:遍历每个元素递归检查 if (Array.isArray(obj)) { for (const item of obj) { if (hasDateInstance(item)) { return true; } } return false; } // 处理对象:遍历所有属性递归检查 if (typeof obj === 'object' && obj !== null) { for (const key of Object.keys(obj)) { if (hasDateInstance(obj[key])) { return true; } } } return false; }
关键说明
- 不管嵌套对象的键是固定还是动态的,
Object.keys(obj)都会遍历当前对象的所有自身可枚举键,所以动态键完全不会影响检测逻辑。 - 递归遍历能覆盖任意深度的嵌套结构,确保不会漏掉深层的
Date实例。
内容的提问来源于stack exchange,提问作者user7041947
相关产品推荐
相关产品推荐

