NoobDEV-GBL
NoobDEV-GBL

Reputation: 352

Filter Array to get specific result between values

I have an array with 24 results from the database, which includes the year and month. the goal is: I know the month and year that was selected, so I get the results for the current year and the previous year, which results in the array of 24.

now I want to get the results for the current month and the previous 11 months.

I still haven't realized how I can do this, I have some tests performed by me here, which is what I currently have but is not correct:

const data = [
  { Data: '01/01/2019 00:00:00', location: '2', month: '01', year: '2019' },
  { Data: '02/01/2019 00:00:00', location: '2', month: '02', year: '2019' },
  { Data: '03/01/2019 00:00:00', location: '2', month: '03', year: '2019' },
  { Data: '04/01/2019 00:00:00', location: '2', month: '04', year: '2019' },
  { Data: '05/01/2019 00:00:00', location: '2', month: '05', year: '2019' },
  { Data: '06/01/2019 00:00:00', location: '2', month: '06', year: '2019' },
  { Data: '07/01/2019 00:00:00', location: '2', month: '07', year: '2019' },
  { Data: '08/01/2019 00:00:00', location: '2', month: '08', year: '2019' },
  { Data: '09/01/2019 00:00:00', location: '2', month: '09', year: '2019' },
  { Data: '10/01/2019 00:00:00', location: '2', month: '10', year: '2019' },
  { Data: '11/01/2019 00:00:00', location: '2', month: '11', year: '2019' },
  { Data: '12/01/2019 00:00:00', location: '2', month: '12', year: '2019' },
  { Data: '01/01/2020 00:00:00', location: '2', month: '01', year: '2020' },
  { Data: '02/01/2020 00:00:00', location: '2', month: '02', year: '2020' },
  { Data: '03/01/2020 00:00:00', location: '2', month: '03', year: '2020' },
  { Data: '04/01/2020 00:00:00', location: '2', month: '04', year: '2020' },
  { Data: '05/01/2020 00:00:00', location: '2', month: '05', year: '2020' },
  { Data: '06/01/2020 00:00:00', location: '2', month: '06', year: '2020' },
  { Data: '07/01/2020 00:00:00', location: '2', month: '07', year: '2020' },
  { Data: '08/01/2020 00:00:00', location: '2', month: '08', year: '2020' },
  { Data: '09/01/2020 00:00:00', location: '2', month: '09', year: '2020' },
  { Data: '10/01/2020 00:00:00', location: '2', month: '10', year: '2020' },
  { Data: '11/01/2020 00:00:00', location: '2', month: '11', year: '2020' },
  { Data: '12/01/2020 00:00:00', location: '2', month: '12', year: '2020' }
]
  const Year = '2020'
  const Month = '11'
  const finalfilter = data.filter(location => location.year === Year)
  console.log(finalfilter)

Expected result shoud be after aplly the filter to get the previous 11 months of the selected month:

const result = [
  { Data: '12/01/2019 00:00:00', location: '2', month: '12', year: '2019' },
  { Data: '01/01/2020 00:00:00', location: '2', month: '01', year: '2020' },
  { Data: '02/01/2020 00:00:00', location: '2', month: '02', year: '2020' },
  { Data: '03/01/2020 00:00:00', location: '2', month: '03', year: '2020' },
  { Data: '04/01/2020 00:00:00', location: '2', month: '04', year: '2020' },
  { Data: '05/01/2020 00:00:00', location: '2', month: '05', year: '2020' },
  { Data: '06/01/2020 00:00:00', location: '2', month: '06', year: '2020' },
  { Data: '07/01/2020 00:00:00', location: '2', month: '07', year: '2020' },
  { Data: '08/01/2020 00:00:00', location: '2', month: '08', year: '2020' },
  { Data: '09/01/2020 00:00:00', location: '2', month: '09', year: '2020' },
  { Data: '10/01/2020 00:00:00', location: '2', month: '10', year: '2020' },
  { Data: '11/01/2020 00:00:00', location: '2', month: '11', year: '2020' },
]

Upvotes: 0

Views: 83

Answers (3)

Terry Lennox
Terry Lennox

Reputation: 30675

You could create a function to get the different in months between the dates, then filter to ensure this is greater than or equal to 0 and below 12:

const data = [
  { Data: '01/01/2019 00:00:00', location: '2', month: '01', year: '2019' },
  { Data: '02/01/2019 00:00:00', location: '2', month: '02', year: '2019' },
  { Data: '03/01/2019 00:00:00', location: '2', month: '03', year: '2019' },
  { Data: '04/01/2019 00:00:00', location: '2', month: '04', year: '2019' },
  { Data: '05/01/2019 00:00:00', location: '2', month: '05', year: '2019' },
  { Data: '06/01/2019 00:00:00', location: '2', month: '06', year: '2019' },
  { Data: '07/01/2019 00:00:00', location: '2', month: '07', year: '2019' },
  { Data: '08/01/2019 00:00:00', location: '2', month: '08', year: '2019' },
  { Data: '09/01/2019 00:00:00', location: '2', month: '09', year: '2019' },
  { Data: '10/01/2019 00:00:00', location: '2', month: '10', year: '2019' },
  { Data: '11/01/2019 00:00:00', location: '2', month: '11', year: '2019' },
  { Data: '12/01/2019 00:00:00', location: '2', month: '12', year: '2019' },
  { Data: '01/01/2020 00:00:00', location: '2', month: '01', year: '2020' },
  { Data: '02/01/2020 00:00:00', location: '2', month: '02', year: '2020' },
  { Data: '03/01/2020 00:00:00', location: '2', month: '03', year: '2020' },
  { Data: '04/01/2020 00:00:00', location: '2', month: '04', year: '2020' },
  { Data: '05/01/2020 00:00:00', location: '2', month: '05', year: '2020' },
  { Data: '06/01/2020 00:00:00', location: '2', month: '06', year: '2020' },
  { Data: '07/01/2020 00:00:00', location: '2', month: '07', year: '2020' },
  { Data: '08/01/2020 00:00:00', location: '2', month: '08', year: '2020' },
  { Data: '09/01/2020 00:00:00', location: '2', month: '09', year: '2020' },
  { Data: '10/01/2020 00:00:00', location: '2', month: '10', year: '2020' },
  { Data: '11/01/2020 00:00:00', location: '2', month: '11', year: '2020' },
  { Data: '12/01/2020 00:00:00', location: '2', month: '12', year: '2020' }
]
const Year = 2020;
const Month = 11;

function getMonthDiff(year1, month1, year2, month2) {
  return (year1 - year2) * 12 + month1 - month2;
}

const finalfilter = data.filter(location => { 
    return (getMonthDiff(Year, Month, location.year, location.month) >= 0) && 
    (getMonthDiff(Year, Month, location.year, location.month) < 12);
    
});
console.log(finalfilter);

Upvotes: 2

Andy
Andy

Reputation: 63524

Instead of using filter find the index of the object you need then slice out the objects before it to create a new array.

const data=[{Data:"01/01/2019 00:00:00",location:"2",month:"01",year:"2019"},{Data:"02/01/2019 00:00:00",location:"2",month:"02",year:"2019"},{Data:"03/01/2019 00:00:00",location:"2",month:"03",year:"2019"},{Data:"04/01/2019 00:00:00",location:"2",month:"04",year:"2019"},{Data:"05/01/2019 00:00:00",location:"2",month:"05",year:"2019"},{Data:"06/01/2019 00:00:00",location:"2",month:"06",year:"2019"},{Data:"07/01/2019 00:00:00",location:"2",month:"07",year:"2019"},{Data:"08/01/2019 00:00:00",location:"2",month:"08",year:"2019"},{Data:"09/01/2019 00:00:00",location:"2",month:"09",year:"2019"},{Data:"10/01/2019 00:00:00",location:"2",month:"10",year:"2019"},{Data:"11/01/2019 00:00:00",location:"2",month:"11",year:"2019"},{Data:"12/01/2019 00:00:00",location:"2",month:"12",year:"2019"},{Data:"01/01/2020 00:00:00",location:"2",month:"01",year:"2020"},{Data:"02/01/2020 00:00:00",location:"2",month:"02",year:"2020"},{Data:"03/01/2020 00:00:00",location:"2",month:"03",year:"2020"},{Data:"04/01/2020 00:00:00",location:"2",month:"04",year:"2020"},{Data:"05/01/2020 00:00:00",location:"2",month:"05",year:"2020"},{Data:"06/01/2020 00:00:00",location:"2",month:"06",year:"2020"},{Data:"07/01/2020 00:00:00",location:"2",month:"07",year:"2020"},{Data:"08/01/2020 00:00:00",location:"2",month:"08",year:"2020"},{Data:"09/01/2020 00:00:00",location:"2",month:"09",year:"2020"},{Data:"10/01/2020 00:00:00",location:"2",month:"10",year:"2020"},{Data:"11/01/2020 00:00:00",location:"2",month:"11",year:"2020"},{Data:"12/01/2020 00:00:00",location:"2",month:"12",year:"2020"}];

const year = '2020';
const month = '11';

const index = data.findIndex(obj => obj.year === year && obj.month === month);

const newArr = data.slice(index - 11, index + 1);

console.log(newArr);

Upvotes: 1

Timothy Alexis Vass
Timothy Alexis Vass

Reputation: 2705

You could use let instead of const and this filter:

let Year = '2020';
let Month = '11';
let finalfilter = data.filter(
     location => location.year == Year && location.month <= Month || location.year == Year-1 && location.month > Month
);

Upvotes: 1

Related Questions