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;iconst 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()在日期范围内不起作用