Tengo la siguiente estructura de datos:
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});Tenga en cuenta que date1 no siempre está disponible, pero date2 es obligatorio. Me gustaría ordenar por date1 primero, luego date2. Creé este violín para probar, pero aún no lo he descubierto: https://jsfiddle.net/y9sgpob8/4/
Por favor, ayúdame a averiguar cómo obtener los resultados en el siguiente orden:
[{ 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" }]Tienes que ordenar según
date1date1date2Dado que las fechas están en formato ISO, puede hacer una comparación de cadenas para ordenar
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)También puede separar los objetos que solo tienen date2 , luego ordenarlos y finalmente fusionarlos. Vea el fragmento a continuación:
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});Todos los registros que no tengan fecha1 se encontrarán al final del resultado, ¿verdad? Si es así, puede separarlos en 2 matrices y fusionarlos.
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]);