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);