使用JQuery按日期范围过滤数组

3
我有一个包含日期对象的数组。
但数据太大,无法解析所有内容。我想按日期范围过滤结果(例如:在10天前到10天之间)。到目前为止,我只能使用单个日期进行过滤。
以下是我的代码。我不知道如何实现这一点。
var today = new Date();
var d = today.getDay();
var dd = String(today.getDate()).padStart(2, '0');
var mm = String(today.getMonth() + 1).padStart(2, '0'); //January is 0!
var yyyy = today.getFullYear();
today = yyyy + '-' + mm + '-' + dd;

var eventParsed = JSON.parse(eventsObjects).filter(({
    date
}) => date === today);

console.log(eventParsed);
5个回答

2
您可以获取绑定日期,例如今天减去10天和今天加上10天,然后在过滤器中使用它们:
function formatDate(date)
{
    var d = date.getDay();
    var dd = String(date.getDate()).padStart(2, '0');
    var mm = String(date.getMonth() + 1).padStart(2, '0'); //January is 0!
    var yyyy = date.getFullYear();
    return yyyy + '-' + mm + '-' + dd;
}

function getDateFromTodayPlus(numberOfDays)
{
    const d = new Date();
    d.setDate(d.getDate() + numberOfDays);
    return formatDate(d);
}

const TenDaysAgoString = getDateFromTodayPlus(-10);

const TenDaysAfterString = getDateFromTodayPlus(10);

// And then, in your filter :

var eventParsed = JSON.parse(eventsObjects).filter(({
    date
}) => TenDaysAgoString <= date && date <= TenDaysAfterString);

工作正常,尽管我选择了更简洁的解决方案。谢谢 - Aoguzie

2
我认为您完全可以避免字符串操作,而只需进行一些日期比较,就像这样:

我认为您可以完全避免字符串操作,而只需进行一些日期比较,就像这样:

var today = new Date();
var tenDaysAgo = new Date();
var tenDaysFromNow = new Date();
tenDaysAgo.setDate(today.getDate() - 10);
tenDaysFromNow.setDate(today.getDate() + 10);

var eventParsed = JSON.parse(eventsObjects).filter(({
    date
}) => date >= tenDaysAgo && date <= tenDaysFromNow);

console.log(eventParsed);

0

数据是否已排序?如果是,则可以使用二分查找和选择连续范围来轻松选择。如果未排序且无法进行排序,则可以使用JS日期对象在过滤时确定日期是否在您的范围内。

检查一个日期是否在两个日期之间(javascript)

但是,如果您需要经常进行此范围选择,则首先对其进行排序并使用更快的二分搜索查找区间端点将更好。


0
假设您解析的JSON字符串中包含日期字符串,并且这些日期在生成的对象中仍表示为字符串,则可以按以下方式进行过滤:

const eventsObjects=[{a:123, date:'2019-10-02'},{a:1123, date:'2019-10-03'},{a:11123, date:'2019-10-09'},{a:111123, date:'2019-10-12'},{a:444123, date:'2019-10-13'},{a:44123, date:'2019-10-31'},{a:4123, date:'2019-11-09'},{a:5123, date:'2019-12-13'}];

var fmt=days=>{ 
 var dat=new Date((new Date()).getTime()+days*86400000);
 var dd = String(dat.getDate()).padStart(2, '0'),
     mm = String(dat.getMonth() + 1).padStart(2, '0'),
   yyyy = dat.getFullYear();
 return yyyy+'-'+mm+'-'+dd;
}
var d1=fmt(-10), d2=fmt(10); 
var eventParsed = eventsObjects.filter(({date}) =>
 (date>=d1 && date<=d2) );


console.log(eventParsed);

在这种方法中,我仅从当前日期对象生成日期字符串一次(添加和减去10天)。过滤本身是通过比较简单的(日期)字符串来完成的。

0

很简单!你已经掌握了大部分内容,这将在日期范围内进行过滤,你只需要获取“10天前”的日期和今天的日期,并过滤出这些日期之间的任何内容。

//start date ten days ago
var startDate = new Date();
startDate.setDate(startDate.getDate() - 10);
//today
var endDate= new Date(); 

var filteredDates= JSON.parse(eventsObjects).filter(
   ({date}) => 
       date >= startDate && date <= endDate
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接