我怎样才能得到过去的第一个最近的日期?
How can i get the first nearest date in the past?
我有这个数组
const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
我需要得到过去第一个最近的日期 - 所以当日期是 2020-07-12
我需要得到
2020-07-06
来自 datesToBeChecked。
我尝试了什么
我试过这个代码
datesToBeChecked.forEach(date => {
let diff = moment(dateToCheckFor).diff(moment(date), 'days');
console.log(diff);
if (diff > 0) {
if (nearestDate) {
if (moment(date).diff(moment(nearestDate), 'days') < 0) {
nearestDate = date;
}
} else {
nearestDate = date;
}
}
});
但这给了我数组中最早的日期 - 2020-07-03。但我需要第一个 BEFORE THE DATE I CHECK FOR
您可以先尝试对散列 table 中的所有日期进行排序。所以你会有一个散列 table:
{
date1: difference,
date2: difference,
...
}
然后您将对对象值进行排序,例如此处:Sorting object property by values
然后从中获取第一个日期,即 dateToCheckFor
之前的日期
我希望这对你来说不是太低效。
这是使用 ole vanilla js 的一种方法。 Moment.js体重230+kb
const datesToBeChecked = ['2020-07-03', '2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
dateToCheckFor_d = new Date(dateToCheckFor).getTime();
let possibilities = datesToBeChecked.filter(dt => {
return (new Date(dt).getTime() < dateToCheckFor_d)
})
possibilities.sort().reverse()
console.log(possibilities[0])
其实你的逻辑就差不多了。您不需要嵌套的 if
条件。本质上,你想要的是缓存差异,并将当前差异与缓存的差异进行比较。如果缓存的差异较小,那么我们就知道当前日期是最近的日期。否则,我们继续搜索。
即使日期未按时间顺序(从旧到新)排序,此解决方案也适用:
const datesToBeChecked = ['2020-07-03', '2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
let nearestDate;
let cachedDiff = Infinity;
datesToBeChecked.forEach(date => {
let diff = moment(dateToCheckFor).diff(moment(date), 'days');
if (diff > 0 && diff < cachedDiff) {
cachedDiff = diff;
nearestDate = date;
}
});
console.log(nearestDate);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
第一个元素是过去最近的日期(至少昨天,今天的结果不会出现)。
如果为空,则 dateToCheckFor
元素不包含任何过去的日期。
const mappedDates = dateToCheckFor
.map(d => moment(dateToCheckFor).diff(moment(d), 'days'))
.filter(diff => diff <= -1)
.sort()
.reverse();
在您的代码中只需更新以下行
if (moment(date).diff(moment(nearestDate), 'days') < 0
至
if (moment(date).diff(moment(nearestDate), 'days') > 0
我有这个数组
const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
我需要得到过去第一个最近的日期 - 所以当日期是 2020-07-12
我需要得到
2020-07-06
来自 datesToBeChecked。
我尝试了什么
我试过这个代码
datesToBeChecked.forEach(date => {
let diff = moment(dateToCheckFor).diff(moment(date), 'days');
console.log(diff);
if (diff > 0) {
if (nearestDate) {
if (moment(date).diff(moment(nearestDate), 'days') < 0) {
nearestDate = date;
}
} else {
nearestDate = date;
}
}
});
但这给了我数组中最早的日期 - 2020-07-03。但我需要第一个 BEFORE THE DATE I CHECK FOR
您可以先尝试对散列 table 中的所有日期进行排序。所以你会有一个散列 table:
{
date1: difference,
date2: difference,
...
}
然后您将对对象值进行排序,例如此处:Sorting object property by values
然后从中获取第一个日期,即 dateToCheckFor
我希望这对你来说不是太低效。
这是使用 ole vanilla js 的一种方法。 Moment.js体重230+kb
const datesToBeChecked = ['2020-07-03', '2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
dateToCheckFor_d = new Date(dateToCheckFor).getTime();
let possibilities = datesToBeChecked.filter(dt => {
return (new Date(dt).getTime() < dateToCheckFor_d)
})
possibilities.sort().reverse()
console.log(possibilities[0])
其实你的逻辑就差不多了。您不需要嵌套的 if
条件。本质上,你想要的是缓存差异,并将当前差异与缓存的差异进行比较。如果缓存的差异较小,那么我们就知道当前日期是最近的日期。否则,我们继续搜索。
即使日期未按时间顺序(从旧到新)排序,此解决方案也适用:
const datesToBeChecked = ['2020-07-03', '2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
let nearestDate;
let cachedDiff = Infinity;
datesToBeChecked.forEach(date => {
let diff = moment(dateToCheckFor).diff(moment(date), 'days');
if (diff > 0 && diff < cachedDiff) {
cachedDiff = diff;
nearestDate = date;
}
});
console.log(nearestDate);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
第一个元素是过去最近的日期(至少昨天,今天的结果不会出现)。
如果为空,则 dateToCheckFor
元素不包含任何过去的日期。
const mappedDates = dateToCheckFor
.map(d => moment(dateToCheckFor).diff(moment(d), 'days'))
.filter(diff => diff <= -1)
.sort()
.reverse();
在您的代码中只需更新以下行
if (moment(date).diff(moment(nearestDate), 'days') < 0
至
if (moment(date).diff(moment(nearestDate), 'days') > 0