I have the following data structure:
var dates = [
{
id: '1',
date1: '2022-03-21T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '2',
date1: '2022-03-20T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '3',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '4',
date2: '2022-03-15T18:59:36.641Z',
}
];
var sorted = dates.sort(function(a,b) {
return (a.date1 > b.date1) ? 1 : -1
});
console.log({sorted});
Notice that date1 is not always available, but date2 is required. I'd like to sort by date1 first, then date2. I've created this fiddle to test, but still haven't figured it out: https://jsfiddle.net/y9sgpob8/4/
Please help me figure out how to get the results in the following order:
[{
date1: "2022-03-20T18:59:36.641Z",
date2: "2022-03-17T18:59:36.641Z",
id: "2"
}, {
date1: "2022-03-21T18:59:36.641Z",
date2: "2022-03-17T18:59:36.641Z",
id: "1"
}, {
date2: "2022-03-15T18:59:36.641Z",
id: "4"
}, {
date2: "2022-03-17T18:59:36.641Z",
id: "3"
}]
You need to sort based on
date1 existsdate1 valuedate2 valueSince the dates are in ISO format, you can do string comparison to sort
const input=[{id:"1",date1:"2022-03-21T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"2",date1:"2022-03-20T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"3",date2:"2022-03-17T18:59:36.641Z",},{id:"4",date2:"2022-03-15T18:59:36.641Z",}];
input.sort((a,b) =>
( ('date1' in b) - ('date1' in a) )
|| (a.date1 ?? '').localeCompare(b.date1 ?? '')
|| a.date2.localeCompare(b.date2)
)
console.log(input)
You could also separate the objects that only have date2 then sort and lastly merge it. See snippet below:
const dates = [
{
id: '1',
date1: '2022-03-21T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '2',
date1: '2022-03-20T18:59:36.641Z',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '3',
date2: '2022-03-17T18:59:36.641Z',
},
{
id: '4',
date2: '2022-03-15T18:59:36.641Z',
}
];
var array1 = [];
var array2 = [];
for (const date in dates) {
if (dates[date].date1) {
array1.push(dates[date]);
} else {
array2.push(dates[date]);
}
}
var sorted1 = array1.sort(function(a,b) {
return (a.date1 > b.date1) ? 1 : -1
});
var sorted2 = array2.sort(function(a,b) {
return (a.date2 > b.date2) ? 1 : -1
});
const sorted = sorted1.concat(sorted2);
console.log({sorted});
All records not have date1 will be found in the end of the result, right? If so, You can separate to 2 arrays and merge them.
const dates=[{id:"1",date1:"2022-03-21T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"2",date1:"2022-03-20T18:59:36.641Z",date2:"2022-03-17T18:59:36.641Z",},{id:"3",date2:"2022-03-17T18:59:36.641Z",},{id:"4",date2:"2022-03-15T18:59:36.641Z",}];
const timeStamp = value => new Date(value).valueOf()
const arrWithDate1 = dates
.filter(elem => elem.date1)
.sort((a, b) => (timeStamp(a.date1) - timeStamp(b.date1)))
const arrWithDate2 = dates
.filter(elem => !elem.date1)
.sort((a, b) => (timeStamp(a.date2) - timeStamp(b.date2)))
console.log([...arrWithDate1, ...arrWithDate2]);