如何找到一组日期中的给定日期?

时间:2018-10-12 05:24:19

标签: javascript react-native

我有如下数组格式的日期集

[
 ["2018-10-15T18:30:00.000Z","2018-10-15T18:30:00.000Z"],
 ["2018-10-23T18:30:00.000Z","2018-10-25T18:30:00.000Z"],
 ["2018-10-28T18:30:00.000Z","2018-10-29T18:30:00.000Z"]
]

我将此数组用于日期范围选择。也就是说,用户选择日期范围为oct 15oct 23-25oct 28-29

我想找到一个给定的日期是上述选择的一部分。并返回所选日期范围的索引。例如,如果我通过Oct 15,则它是选择的一部分,因此输出将是索引0;如果我给出OCT 24,则它也是选择OCT 23-25的一部分,并且输出将成为索引1。如果我给出Nov 1,则它不是select输出的一部分,输出将为-1

所以我的问题是如何通过优化的解决方案实现这一目标。到目前为止,我要做的是

function getIndexOfDate(dateSelected = [], currentDate) {
  for (i = 0; i < dateSelected.length; i++) {
    if(checkDateIsPartOfDateRange(dateSelected[i],currentDate)){
      return i;
    }
  }
  return -1
}


function checkDateIsPartOfDateRange(dateRange = [], date) {
  startDate = dateRange[0];
  endDate = dateRange[1]
  if (date.getTime() >= startDate.getTime() && date.getTime() <= endDate.getTime()) {
    return true;
  } else {
    return false;
  }
}

我不知道,但是我认为这不是一个优化的解决方案,可能有另一种方法可以做到这一点。请给我建议一个。

2 个答案:

答案 0 :(得分:2)

由于数组中的日期为ISO 8601格式,因此您可以使用字符串比较来比较它们(只要不存在时区信息)。

然后可以将Array.prototype.findIndex()与回调函数一起使用以获取数组中的索引:

const getIndex = (dates, d) => dates.findIndex(([s, e]) => d >= s && d <= e);

这是完整的代码段:

const dates = [
 ["2018-10-15T18:30:00.000Z","2018-10-15T18:30:00.000Z"],
 ["2018-10-23T18:30:00.000Z","2018-10-25T18:30:00.000Z"],
 ["2018-10-28T18:30:00.000Z","2018-10-29T18:30:00.000Z"]
];

const getIndex = (dates, d) => dates.findIndex(([s, e]) => d >= s && d <= e);

console.log(getIndex(dates, '2018-10-24T12:00:00.000Z')); // 1
console.log(getIndex(dates, '2018-10-26T12:00:00.000Z')); // -1

如果使用Date对象,则使用相同的代码段:

const dates = [
 [new Date("2018-10-15T18:30:00.000Z"),new Date("2018-10-15T18:30:00.000Z")],
 [new Date("2018-10-23T18:30:00.000Z"),new Date("2018-10-25T18:30:00.000Z")],
 [new Date("2018-10-28T18:30:00.000Z"),new Date("2018-10-29T18:30:00.000Z")]
];

const getIndex = (dates, d) => dates.findIndex(([s, e]) => d >= s && d <= e);

console.log(getIndex(dates, new Date('2018-10-24T12:00:00.000Z'))); // 1
console.log(getIndex(dates, new Date('2018-10-26T12:00:00.000Z'))); // -1

答案 1 :(得分:1)

您可以使用getTime()函数将日期转换为时间戳,然后可以将它们进行比较以找到匹配项

    function findDateFromArray(dates,date) {
      return dates.findIndex((elem) => {
        return elem.getTime() === date.getTime()
      })
    }

    console.log(findDateFromArray(dates,date))