如何从日期数组中获取指定日期的最近过去日期?
如何从日期数组中找到指定日期之前的最近过去日期?
你现在有这样的日期数组和目标日期:
const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20'] const dateToCheckFor = '2020-07-12';
想要找到dateToCheckFor之前的最近日期(这里期望得到2020-07-06),但之前写的forEach代码返回了最早的2020-07-03,这是因为你的逻辑判断搞反了。
问题出在哪里?
你的代码里,当找到一个在目标日期之前的日期时,判断moment(date).diff(moment(nearestDate), 'days') < 0——这个条件的意思是当前date比已经记录的nearestDate更早,所以每次都会把更早的日期赋值给nearestDate,最后自然得到数组里最早的日期,完全和你想要的“最近”相反。
解决方案1:简化逻辑,先筛选再取最大值
最简单的方式是先把所有早于目标日期的日期筛选出来,然后从中找出最大的那个(也就是最近的)。因为ISO格式的日期字符串(YYYY-MM-DD)可以直接比较大小,甚至不用moment也能实现:
const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20'] const dateToCheckFor = '2020-07-12'; // 筛选出所有早于目标日期的日期 const pastDates = datesToBeChecked.filter(date => date < dateToCheckFor); // 取其中最大的(最近的) const nearestDate = pastDates.length ? Math.max(...pastDates) : null; console.log(nearestDate); // 输出 "2020-07-06"
如果一定要用moment的话,逻辑类似:
const pastDates = datesToBeChecked.filter(date => moment(date).isBefore(dateToCheckFor)); const nearestDate = pastDates.length ? moment.max(pastDates.map(date => moment(date))).format('YYYY-MM-DD') : null;
解决方案2:修正你的forEach逻辑
如果要保留forEach的写法,需要调整判断条件:当找到符合条件的日期时,要比较它是否比当前记录的nearestDate更晚(也就是离目标日期更近),可以直接比较日期字符串大小:
const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20'] const dateToCheckFor = '2020-07-12'; let nearestDate = null; datesToBeChecked.forEach(date => { const isPastDate = moment(date).isBefore(dateToCheckFor); if (isPastDate) { if (!nearestDate || date > nearestDate) { // 如果还没记录过nearestDate,或者当前date比已记录的更晚(更近),就替换 nearestDate = date; } } }); console.log(nearestDate); // 输出 "2020-07-06"
这样调整后,逻辑就正确了,每次都会保留离目标日期最近的那个过去日期。
内容的提问来源于stack exchange,提问作者Petar
相关产品推荐
相关产品推荐

