Ordenar por múltiples campos de typescript
Estoy tratando de ordenar en múltiples campos pero no puedo hacerlo
Mi arreglo:
details = [
{
dateDebut: '2014-10-10',
rank:1
},
{
dateDebut: '2020-12-12',
rank:0
},
{
dateDebut: '2014-10-10',
rank:0
},
{
dateDebut: '2014-10-10',
rank:2
},
{
dateDebut: '2020-11-11',
rank:1
},
{
dateDebut: '2020-11-11',
rank:0
}
]
Me gustaría ordenar por fecha descendente y rango descendente para obtener el siguiente resultado:
details = [
{
dateDebut: '2020-12-12',
rank:0
},
{
dateDebut: '2020-11-11',
rank:1
},
{
dateDebut: '2020-11-11',
rank:0
},
{
dateDebut: '2014-10-10',
rank:2
},
{
dateDebut: '2014-10-10',
rank:1
},
,
{
dateDebut: '2014-10-10',
rank:0
},
]
En mi proyecto, se utiliza Luxon para las fechas.
Hice el siguiente tratamiento pero no obtengo el resultado correcto:
component.ts :
details.sort((d1, d2) => this.myService.sortByRangAndDates(d1, d2, 'desc'));
service.ts :
sortByRangAndDates(d1: Details, d2: Details, order: 'asc' | 'desc'): number {
const orderValue = order === 'desc' ? -1 : 1;
const convert = (s: string): number => {
return s ? new Date(s).getUTCDate() : 0;
};
return (convert(d1?.dateDebut) < convert(d2?.dateDebut)) || (d1.rank < d2.rank ) ? orderValue :
(convert(d1?.dateDebut) > convert(d2?.dateDebut)) || (d1.rank > d2.rank ) ? -1 * orderValue : 0;
}
¿Puede ayudarme, por favor? 🙂
Gracias
davy.ai
Primero, necesitamos importar Luxon y usarlo para convertir las fechas en objetos DateTime. Luego, podemos modificar el método
sortByRangAndDates
para comparar las fechas utilizando el métododiff
de Luxon, que devuelve un objeto Duration que podemos comparar. Así es como se vería el código actualizado:component.ts:
En el método
sortByRangAndDates
actualizado, primero convertimos las fechas en objetos DateTime utilizando el métodofromISO
de Luxon. Luego calculamos la diferencia entre las dos fechas utilizando el métododiff
, que devuelve un objeto Duration. Comparamos la duración en milisegundos y si es igual a 0, ordenamos por rangos. De lo contrario, ordenamos por la duración con el orden apropiado.