按最近12个月的日期(年初至今)过滤数组

时间:2018-06-27 11:19:14

标签: javascript arrays date momentjs lodash

我有一个数组,希望根据今天(从过去的日期)开始的一年(仅限过去的一年)筛选出结果。我可以使用lodash和momentjs,因此请想象使用它们来帮助实现我的目标。如下所示,我只想在去年内将.gameScore与.reportDate一起使用。

我的数组看起来像这样...(因此它只应返回年初至今的第一个对象)

ntpd

我正在处理应该放在过滤器之后的数据:

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

感谢任何帮助。谢谢

5 个答案:

答案 0 :(得分:2)

您可以使用 Array.filter() method 并通过分别比较 yearsmonths 来过滤相关的日期然后 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>

答案 1 :(得分:0)

假设observations包含这些对象,您可以像这样过滤它们:

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

答案 2 :(得分:0)

使用momentjs会是这样:

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

或者这个:

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

请注意,momentjs v2.11.0已添加isSameOrBefore。从v2.0.0开始,有单独的功能isSameisBefore,或者您可以取反isAfter。在docs中查看更多信息。

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>

答案 3 :(得分:0)

您将获得去年的日期。然后对此进行过滤

喜欢

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,然后简单地比较日期

答案 4 :(得分:0)

首先,您必须获取日期的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()的回调中出现