Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在一组日期数组中查找给定日期?_Javascript_React Native - Fatal编程技术网

Javascript 如何在一组日期数组中查找给定日期?

Javascript 如何在一组日期数组中查找给定日期?,javascript,react-native,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"] ] 我使用这个数组来选择日期范围。即,用户选择日期范围为10月15日,10月23-25日,10月28-29日 我想

我有一组数组格式的日期,如下所示

[
 ["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"]
]
我使用这个数组来选择日期范围。即,用户选择日期范围为
10月15日
10月23-25日
10月28-29日

我想找到一个给定的日期是在上述选择的一部分。并返回所选日期范围的索引。例如,如果我通过
oct15
,则它是选择的一部分,因此输出将是索引0;如果我给出
oct24
,则它也是选择的一部分
oct23-25
,并且输出将是索引1。如果我给出
11月1日
,则它不是选择输出的一部分,输出将是
-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;
  }
}
函数getIndexOfDate(dateSelected=[],currentDate){ 对于(i=0;i如果(date.getTime()>=startDate.getTime()&&date.getTime()因为数组中的日期是ISO 8601格式的,则可以使用字符串比较来比较它们(只要不存在时区信息)

然后可以与回调函数一起使用以获取数组中的索引:

const getIndex = (dates, d) => dates.findIndex(([s, e]) => d >= s && d <= e);
const getIndex=(dates,d)=>dates.findIndex(([s,e])=>d>=s&&d您可以使用
getTime()
函数将日期转换为时间戳,然后您可以比较它们以找到匹配项

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

    console.log(findDateFromArray(dates,date))

如果您可以将数据存储为一个对象,并将日期作为键,则查找起来可能会更容易/更快。不确定它是否适合您,但不妨尝试一下。日期保存为日期对象。您所说的日期作为键是什么意思。很抱歉,我不明白。我不是指日期,我是指数据,就像您现在的日期集是一个数组:)好的。我明白了。但在我的情况下,我需要这个数组。在处理日期时,请进行日期比较,而不是字符串。@Rajesh感谢您的反馈。据我所知,您的参考小提琴会产生正确的结果。为什么在使用格式正确的ISO 8601日期(没有时区信息)时字符串比较会出现问题?@Rajesh或timestampsThanks获得答案。我运行了一些性能测试。如果数组较小,两个解决方案的时间相同。但是如果有很多日期范围,假设50到100比较解决方案,我的解决方案运行得更快(不是那么快,仅平均1毫秒:).但是我认为“更少的代码”是这个答案的一个优势。所以我的答案是+1side@Rajesh同意。当处理
日期
对象时,使用
+
强制数字会更好,因为比较可能更快。但是,我不知道当前有哪个浏览器返回的日期字符串格式在词汇上不可比ble。这不会检查日期是否在指定的开始日期和结束日期之间,但是。崩溃..不起作用。我认为elem.getTime()==date.getTime()在日期范围内不起作用