判断数组中Date类型元素相等的If语句未按预期触发问题
问题分析与解决方案
哦,我一眼就看出问题所在啦!你这里遇到的是JavaScript里引用类型比较的典型坑——Date对象不能直接用==或者===来比较时间是否相等。
为什么你的判断不生效?
在JS里,Date是引用类型,当你用==比较两个Date对象时,它实际比较的是这两个对象在内存中的引用地址,而不是它们代表的时间值。哪怕两个Date对象的时间完全一致,它们也是内存里独立的两个对象,所以==会返回false,自然进不了你的判断语句。
怎么修复这个问题?
你需要把Date对象转换成可以直接比较的原始类型,比如时间戳(毫秒数),常用的方法有两种:
- 调用
getTime()方法,返回从1970年1月1日到当前时间的毫秒数(数字类型) - 调用
valueOf()方法,效果和getTime()完全一致,也是返回时间戳
另外,你的双重循环还有个小问题:会重复检测冲突(比如i=0,j=1和i=1,j=0都会触发一次相同的冲突提示),可以把内层循环的起始值改成i+1,这样就能避免重复处理,提升效率。
修改后的代码
let sessions = [ {"title": "Lecture", "sessionTime": new Date(2021, 8, 28, 9), "staff": "example"}, {"title": "fake", "sessionTime": new Date(2021, 8, 28, 9), "staff": "example"}, {"title": "Lab 1", "sessionTime": new Date(2021, 8, 28, 14), "staff": "example"}, {"title": "Lab 2", "sessionTime": new Date(2021, 9, 1, 11), "staff": "example"} ]; const errorCheck1 = function(sessions) { for (let i = 0; i < sessions.length; i++) { // 内层循环从i+1开始,避免重复检查 for (let j = i + 1; j < sessions.length; j++) { // 用getTime()获取时间戳来比较 if (sessions[i].sessionTime.getTime() === sessions[j].sessionTime.getTime()) { $("#errors").append("<li>" + sessions[i].title + " clashes with " + sessions[j].title +"</li>"); } } } }
额外小提示
如果你的环境支持ES6+,也可以用Number()把Date对象转成时间戳,比如Number(sessions[i].sessionTime) === Number(sessions[j].sessionTime),效果和上面的方法一样,写法更简洁~
内容的提问来源于stack exchange,提问作者Josh Bent
相关产品推荐
相关产品推荐

