【问题标题】:Filter Array by date of last 12 months(year to date)按过去 12 个月(年初至今)的日期过滤数组
【发布时间】:2018-12-06 06:30:39
【问题描述】:

我有一个数组,我想从今天开始根据一年(仅过去一年)过滤掉结果。我有 lodash 和 momentjs 供我使用,所以想象一下使用它们来帮助实现我的目标。如下所示,我只想在去年使用 .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();

感谢任何帮助。谢谢

【问题讨论】:

  • 你的意思是只过滤今年的日期?
  • 从今天开始的一年,例如 27/06/2018 到 27/06/2017
  • 问题始于将日期作为字符串。如果它们是时间戳或 ISO 日期,您可以简单地使用带有给定最小值和最大值的 array.filter()。
  • @TomRudge你可以通过分别比较yearsmonths然后days来做到这一点,只保留去年的那些。查看my answer了解更多详情。

标签: javascript arrays date momentjs lodash


【解决方案1】:

你可以使用 Array.filter() method 并过滤相关的日期,分别比较 years, months then @ 987654325@.

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>

【讨论】:

  • OP 是去年想要的,而不是前一年
  • @barbsan 是的,我编辑了答案以考虑年月日比较。
  • 这只是带回2017年的数据,它应该只返回2018-05-09,因为那是去年的。 2017-06-12 是一年多以前
  • @TomRudge 我的错,我颠倒了条件;我编辑了答案。
  • 感谢 @chŝdk 和所有其他贡献者 - 希望它也能帮助其他人
【解决方案2】:

你会得到去年的日期。然后对其进行过滤

喜欢

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        【解决方案5】:

        使用 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>

        【讨论】:

          猜你喜欢
          • 2017-12-13
          • 1970-01-01
          • 1970-01-01
          • 2018-04-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-08
          相关资源
          最近更新 更多