Search code examples
javascriptarraysfiltermomentjslodash

Filter array to last 12 months in JS


Given an array object, filter the array to return the last 12 months of data.

Example 1: today is May 2021, so the returned data date range is in between June 2020 until May 2021.

Example 2: for year 2016, the returned data date range is in between June 2015 until May 2016.

var observations = [
 {gameScore: "1", reportDate: "2021-09-09"},
 {gameScore: "1", reportDate: "2021-05-09"},
 {gameScore: "1", reportDate: "2020-06-09"},
 {gameScore: "1", reportDate: "2020-04-09"},
 {gameScore: "1", reportDate: "2019-08-09"},
 {gameScore: "1", reportDate: "2019-03-09"},
];

//example 1
const example1Result = _.filter(observations, o=> moment()
  .add(-12, "months")
  .isSameOrBefore(moment(o.reportDate)));
console.log(example1Result);

//example 2
const example2Result = _.filter(observations, o=> !moment()
  .add(-1, "year")
  .isAfter(moment(o.reportDate)));
console.log(example2Result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.21/lodash.min.js"></script>

However, it returns June-December 2021, which in this case, it shouldn't. Not sure how to achieve the Example 2?

Fiddle: https://jsfiddle.net/y912drhm/


Solution

  • You can you se isBetween method of moment (and use .subtract() in alternative to .add(-12 ..))

    let result = observations.filter(o => moment(o.reportDate, 'YYYY-MM-DD').isBetween(moment().subtract(12, 'months'), moment(), undefined, '[]'));
    

    The [ like fourth parametes is just for include([ or ]) or exclude(( or )) the dates used for limit for range. [Here the documentation][1]

    var observations = [
      {gameScore: "1", reportDate: "2021-09-09"},
      {gameScore: "1", reportDate: "2021-05-09"},
      {gameScore: "1", reportDate: "2020-06-09"},
      {gameScore: "1", reportDate: "2020-04-09"},
      {gameScore: "1", reportDate: "2019-08-09"},
      {gameScore: "1", reportDate: "2019-03-09"},
    ];
    
    result = observations.filter(o => moment(o.reportDate, 'YYYY-MM-DD').isBetween(moment().subtract(12, 'months'), moment(), '[]'));
    
    console.log(result);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

    [1]: https://momentjs.com/docs/#/query/is-between/
    

    Example 2

    var example1 = [
    {gameScore: "1", reportDate: "2021-09-09"},
    {gameScore: "1", reportDate: "2021-05-09"},
    {gameScore: "1", reportDate: "2021-04-09"},
    {gameScore: "1", reportDate: "2020-08-09"},
    {gameScore: "1", reportDate: "2020-06-09"},
    {gameScore: "1", reportDate: "2020-04-09"},
    {gameScore: "1", reportDate: "2019-08-09"},
    {gameScore: "1", reportDate: "2019-03-09"},
    ];
    
    var example2 = [
    {gameScore: "1", reportDate: "2016-09-09"},
    {gameScore: "1", reportDate: "2016-05-09"},
    {gameScore: "1", reportDate: "2016-04-09"},
    {gameScore: "1", reportDate: "2015-08-09"},
    {gameScore: "1", reportDate: "2015-06-09"},
    {gameScore: "1", reportDate: "2015-04-09"},
    {gameScore: "1", reportDate: "2014-08-09"},
    {gameScore: "1", reportDate: "2014-03-09"},
    ];
    
    let referenceYear = 2016
    
    let result = example1.filter(o => moment(o.reportDate, 'YYYY-MM-DD').isBetween(moment().subtract(12, 'months'), moment(), '[]'));
    console.log(result);
    
    let result2 = example2.filter(o => moment(o.reportDate, 'YYYY-MM-DD').isBetween(moment(new Date(new Date().setFullYear(referenceYear-1))), moment(new Date(new Date().setFullYear(referenceYear))), '[]'));
    console.log(result2);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>