Jquery Фильтр массив по диапазону дат - PullRequest
3 голосов
/ 22 октября 2019

У меня есть массив, содержащий объекты даты.

Но данные слишком велики, чтобы анализировать все. Я хочу отфильтровать результаты по диапазону дат (например: от 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);

Ответы [ 4 ]

2 голосов
/ 22 октября 2019

Вы можете получить связанные даты, такие как сегодня минус 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);
2 голосов
/ 22 октября 2019

Я думаю, что вы можете избежать манипуляции со строками и просто сделать несколько сравнений дат, например:

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 голосов
/ 22 октября 2019

Предполагая, что ваша разобранная строка 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 дней). Сама фильтрация происходит путем сравнения простых (date-) строк.

0 голосов
/ 22 октября 2019

Данные отсортированы? Потому что тогда это очень простой выбор с использованием бинарного поиска и выбора непрерывного диапазона. Если он не отсортирован, а сортировка невозможна, вы можете использовать объекты даты JS, чтобы определить, находится ли дата в вашем диапазоне при фильтрации.

проверить, находится ли одна дата между двумя датами (javascript)

Однако, если вам нужно будет сделать этот диапазон, выбирая много, то сначала сортируйте его и выполняйте быстреебинарный поиск для концов интервала будет лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...