JavaScript新手求助:从对象数组获取日期并与当前日期对比
对象数组日期比对问题:代码修正与说明
你的代码存在几个关键问题,导致日期比对逻辑无法正常工作,下面逐一指出并给出修正方案:
原代码的核心问题
- 错误获取数组元素的日期:
let objectDate = menu.date;中,menu是数组,没有date属性,这行得到的是undefined,且循环里未更新该变量,所有判断都基于无效值 - 字符串直接比对日期不可靠:你将当前日期拼成
day-month-year格式的字符串,和数组里的DD/MM/YYYY字符串直接比较,本质是按字符顺序比对,而非实际日期的先后(比如"10-1-2024"会被认为比"09-12-2023"小,这显然不符合实际日期逻辑) - 日期格式不统一:当前日期的分隔符是
-,数组里是/,直接全等比对永远不会触发"当天"的判断逻辑
修正后的代码
const menu = [ { id: 1, title: "title of item one", date: "22/12/2023", }, { id: 2, title: "title of item two", date: "01/02/2024", }, { id: 3, title: "title of item three", date: "18/04/2024", }, ]; // 工具函数:将DD/MM/YYYY格式的字符串转为Date对象 function parseDDMMYYYY(dateStr) { const [day, month, year] = dateStr.split('/').map(Number); // 注意:Date的月份是0开始的,所以要减1 return new Date(year, month - 1, day); } // 工具函数:将Date对象格式化为DD/MM/YYYY的字符串(补前导零) function formatDDMMYYYY(date) { const day = String(date.getDate()).padStart(2, '0'); const month = String(date.getMonth() + 1).padStart(2, '0'); const year = date.getFullYear(); return `${day}/${month}/${year}`; } // 获取当前日期(仅保留年月日,去掉时分秒) const currentDate = new Date(); currentDate.setHours(0, 0, 0, 0); // 遍历数组处理每个元素 menu.forEach(item => { const itemDate = parseDDMMYYYY(item.date); // 同样去掉itemDate的时分秒,确保只比对日期部分 itemDate.setHours(0, 0, 0, 0); const formattedItemDate = formatDDMMYYYY(itemDate); if (itemDate < currentDate) { console.log(`【${item.title}】Sorry this deal is expired`); } else if (itemDate.getTime() === currentDate.getTime()) { console.log(`【${item.title}】Hurry! Expires TODAY`); } else { console.log(`【${item.title}】Expires on ${formattedItemDate}`); } });
关键逻辑说明
日期解析与格式化:
parseDDMMYYYY函数把DD/MM/YYYY字符串拆分成日、月、年,转成数字后传入Date构造器(注意JS Date的月份是0-11,所以要减1)formatDDMMYYYY函数用padStart(2, '0')确保日和月都是两位数字(比如1变成"01"),输出标准的DD/MM/YYYY格式
日期比对的正确性:
- 把当前日期和每个元素的日期都设置时分秒为0,避免因为时间部分(比如当前是下午3点,而itemDate默认是凌晨0点)导致的比对错误
- 用
getTime()获取时间戳来判断日期是否相等,直接用===比对Date对象会因为引用不同而失效
遍历数组的正确姿势:
- 使用
forEach遍历数组,比for循环更简洁,直接拿到每个item,然后取item.date即可
- 使用
内容的提问来源于stack exchange,提问作者user23321762
相关产品推荐
相关产品推荐

