如何在JS对象比较函数中验证不同格式的相同日期?
解决日期格式不同但值相同的对象属性比较问题
你的问题核心是直接用!==比较会把格式不同但时间戳一致的日期字符串判定为不同值,需要给函数增加日期专属的比较逻辑。
修改方案
新增日期相等判断的辅助逻辑,先尝试将值转为Date对象,通过时间戳来验证是否为同一时间,而非直接比较字符串。
完整代码如下:
function getPropertyDifferences(obj1, obj2) { // 辅助函数:判断两个值是否为等效日期 function areDatesEqual(date1, date2) { const d1 = new Date(date1); const d2 = new Date(date2); // 验证是否为有效日期,且时间戳完全一致 return !isNaN(d1.getTime()) && !isNaN(d2.getTime()) && d1.getTime() === d2.getTime(); } return Object.entries(obj1).reduce((diff, [key, value]) => { if (obj2.hasOwnProperty(key)) { const val = obj2[key]; // 先判断当前属性值是否为可解析的日期格式 const isBothDates = !isNaN(new Date(value).getTime()) && !isNaN(new Date(val).getTime()); // 日期类型用辅助函数比较,非日期类型保留原严格比较逻辑 if (isBothDates ? !areDatesEqual(value, val) : val !== value) { return { ...diff, [key]: val, }; } } return diff; }, {}); } // 测试用例 const a = { dateOfBirth: "Wed Jan 06 2021 12:00:05 GMT-0700 (Mexican Pacific Standard Time)", name: "test" }; const b = { dateOfBirth: "2021-01-06T12:00:05.357", name: "test" }; console.log(getPropertyDifferences(a, b)); // 输出 {},日期被判定为相同
关键说明
- 日期有效性校验:用
!isNaN(new Date(val).getTime())确保值能被解析为有效日期,避免把非日期字符串误判为日期 - 时间戳比较:同一时间的不同格式日期,转换为
Date对象后的时间戳(getTime()返回值)完全一致,以此作为相等判定依据 - 兼容原有逻辑:仅对日期类型做特殊处理,其他类型(如字符串、数字)仍保留原有的严格不等判断
内容的提问来源于stack exchange,提问作者Jesus
相关产品推荐
相关产品推荐

