Фильтр Array по дате последних 12 месяцев (год к дате) - PullRequest
0 голосов
/ 27 июня 2018

У меня есть массив, который я хочу отфильтровать результаты на основе года (только за прошлый год) с сегодняшней даты. В моем распоряжении есть lodash и моменты, так что представьте, как они используются для достижения моей цели. Как показано ниже, я хочу использовать .gameScore только с .reportDate в течение последнего года.

Мой массив выглядит следующим образом ... (поэтому он должен возвращать только первый объект как его в диапазоне от года к дате)

0:{gameScore: "1", reportDate: "2018-05-09"} 
1:{gameScore: "3", reportDate: "2017-06-12"}

Я делаю другие вещи с данными, которые должны следовать после фильтра:

var result = _(observations)
.omitBy(x => x.gameScore === "NULL")
.map(observation => ({ ...observation, value: SCORES[observation.gameScore] }))
.value();

Ценю любую помощь. Спасибо

Ответы [ 5 ]

0 голосов
/ 27 июня 2018

Ну, вы можете использовать Array.filter() метод и отфильтровать релевантные даты путем сравнения соответственно years, months затем days.

var result = observations
  .filter(observation => {
    return (
        moment(observation.reportDate).year() == moment().subtract('years', 1).year() &&
        (moment(observation.reportDate).month() > moment().subtract('years', 1).month() ||
        moment(observation.reportDate).month() == moment().subtract('years', 1).month() &&
        moment(observation.reportDate).days() >= moment().subtract('years', 1).days())) 
          ||
        (moment(observation.reportDate).year() == moment().year() &&
        (moment(observation.reportDate).month() < moment().month() ||
        moment(observation.reportDate).month() == moment().month() &&
        moment(observation.reportDate).days() <= moment().days())
        );
  });

Демо-версия:

var observations = [{
    gameScore: "1",
    reportDate: "2018-05-09"
  },
  {
    gameScore: "3",
    reportDate: "2017-06-12"
  }
];

var result = observations
  .filter(observation => {
    return (
        moment(observation.reportDate).year() == moment().subtract('years', 1).year() &&
        (moment(observation.reportDate).month() > moment().subtract('years', 1).month() ||
        moment(observation.reportDate).month() == moment().subtract('years', 1).month() &&
        moment(observation.reportDate).days() >= moment().subtract('years', 1).days())) 
          ||
        (moment(observation.reportDate).year() == moment().year() &&
        (moment(observation.reportDate).month() < moment().month() ||
        moment(observation.reportDate).month() == moment().month() &&
        moment(observation.reportDate).days() <= moment().days())
        );
  });

console.log(result);
<script src="https://rawgit.com/moment/moment/2.2.1/min/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.core.js"></script>
0 голосов
/ 27 июня 2018

Сначала вам нужно получить объект moment вашей даты, преобразовать его в метку времени Unix, а затем сравнить его с меткой времени текущего времени.

var date = moment("29-06-1995").unix();
var current = moment().unix;
var difference = current - date;

Тогда вы можете увидеть, больше ли разница, чем год

if(difference >= 31556926) {
    return false;
} else {
    return true;
}

Это условие перейдет в обратный вызов для вашего array.filter()

0 голосов
/ 27 июня 2018

Используя моментальные моменты, это будет примерно так:

_.filter(observations, o=> moment().add(-12, "months").isSameOrBefore(moment(o.reportDate)))

или это:

_.filter(observations, o=> !moment().add(-1, "year").isAfter(moment(o.reportDate)))

Обратите внимание, что isSameOrBefore был добавлен в momentjs v2.11.0. Начиная с версии 2.0.0 существуют отдельные функции isSame и isBefore, или вы можете отменить isAfter. Подробнее смотрите в документах .

var observations = [
{gameScore: "1", reportDate: "2018-05-09"},
{gameScore: "3", reportDate: "2017-06-12"}
];

var result = _.filter(observations, o=> moment().add(-12, "months").isSameOrBefore(moment(o.reportDate)));

console.log(result);

result = _.filter(observations, o=> !moment().add(-1, "year").isAfter(moment(o.reportDate)));

console.log(result);
<script src="https://rawgit.com/moment/moment/2.11.0/min/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.core.js"></script>
0 голосов
/ 27 июня 2018

Вы получите дату прошлого года. И затем фильтр на этом

как

var dates = [
{gameScore: "1", reportDate: "2018-05-09"},
{gameScore: "3", reportDate: "2017-06-12"}];

var date = new Date();
date.setFullYear(date.getFullYear() - 1);
date.setHours(0,0,0,0)

var filteredDates = dates.filter( o=> new Date(o.reportDate) >= date);

console.log(filteredDates)

Чтобы получить дату последнего, да, вы можете просто вычесть из года с помощью и затем .setFullYear, а затем просто сравнить даты

0 голосов
/ 27 июня 2018

Предполагая, observations содержит те объекты, которые вы можете отфильтровать их следующим образом:

var date = new Date();
date.setFullYear( date.getFullYear() - 1 );
observations.filter(x => {
    return new Date(x.reportDate) - date > 0;
});
...