我怎样才能得到过去的第一个最近的日期?

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