Home > Back-end >  Get Min date and Max date from Object
Get Min date and Max date from Object

Time:10-13

How can I find out the min and the max date from an object? Currently, I am getting an array like this: min date should be '2010-02-24' and max date should be '2022-10-04'.

Is there any built-in function to do this? Thanks in advance.

{
       "2010":[
          {
             "id":1243,
             "eventName":"sample_01",
             "categoryType":"CUSTOM_NOTES",
             "tags":"tag19",
             "startDate":"2010-02-24",
             "endDate":"2010-02-26",
             "attachments":[
                
             ]
          }
       ],
       "2022":[
          {
             "id":1244,
             "eventName":"sample_02",
             "categoryType":"CUSTOM_NOTES",
             "tags":"tag1, tag12, tag3, tag52, tag19",
             "startDate":"2022-10-04",
             "endDate":"2022-12-12",
             "attachments":[
                
             ]
          },
          {
             "id":1245,
             "eventName":"hello_03",
             "categoryType":"CUSTOM_NOTES",
             "tags":"tag1, tag12",
             "startDate":"2022-06-01",
             "endDate":"2010-06-26",
             "attachments":[
                
             ]
          }
       ]
    }


filterEventsByDates = () => {
    const filterDateFn = (a, b) => a.startDate.localeCompare(b.startDate);
  setDateFiltersToState(filterDateFn);
}

setDateFiltersToState = (filterDateFn) => {
  this.setState(state => {
   const events = {};
   for (const [year, items] of Object.entries(state.events)) {
     events[year] = items.slice().filter(filterDateFn);
   }
  return { events };
 });
}

CodePudding user response:

A sort will do the job here, by packing all dates into an array first:

const values = {
   "2010":[
      {
         "id":1243,
         "eventName":"sample_01",
         "categoryType":"CUSTOM_NOTES",
         "tags":"tag19",
         "startDate":"2010-02-24",
         "endDate":"2010-02-26",
         "attachments":[

         ]
      }
   ],
   "2022":[
      {
         "id":1244,
         "eventName":"sample_02",
         "categoryType":"CUSTOM_NOTES",
         "tags":"tag1, tag12, tag3, tag52, tag19",
         "startDate":"2022-10-04",
         "endDate":"2022-12-12",
         "attachments":[

         ]
      },
      {
         "id":1245,
         "eventName":"hello_03",
         "categoryType":"CUSTOM_NOTES",
         "tags":"tag1, tag12",
         "startDate":"2022-06-01",
         "endDate":"2010-06-26",
         "attachments":[

         ]
      }
   ]
};

// include startDate only
const dates = Object.values(values).flatMap(v =>
    v.map(({startDate}) => startDate)).sort();

console.log(dates[0], dates.pop());

// include startDate and endDate
const datesAny = Object.values(values).flatMap(v =>
    v.flatMap(({startDate, endDate}) => [startDate, endDate])).sort();

console.log(datesAny[0], datesAny.pop());

CodePudding user response:

Here you can make use of reduce function. & check if the date is less or more(with the one stored in accumulator).

const obj = {"2010":[{"id":1243,"eventName":"sample_01","categoryType":"CUSTOM_NOTES","tags":"tag19","startDate":"2010-02-24","endDate":"2010-02-26", "attachments":[                ]} ], "2022":[{ "id":1244,              "eventName":"sample_02",              "categoryType":"CUSTOM_NOTES",              "tags":"tag1, tag12, tag3, tag52, tag19",              "startDate":"2022-10-04",              "endDate":"2022-12-12",              "attachments":[                              ]           },           {              "id":1245,              "eventName":"hello_03",              "categoryType":"CUSTOM_NOTES",              "tags":"tag1, tag12",              "startDate":"2022-06-01",              "endDate":"2010-06-26",              "attachments":[                              ]           }        ]     };
const result = Object.values(obj).flat().reduce((a,e)=>{
    if(new Date(e.startDate)<new Date(a.min) || !a.min) a.min=e.startDate;
    if(new Date(e.startDate)>new Date(a.max)) a.max=e.startDate;
    return a;
},{min:null, max:null});

console.log(result);

  • Related