es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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

Tags:  , , ,

Answer

  1. Avatar for 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étodo diff de Luxon, que devuelve un objeto Duration que podemos comparar. Así es como se vería el código actualizado:

    component.ts:

    import { DateTime } from 'luxon';
    
    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): DateTime => {
        return s ? DateTime.fromISO(s) : DateTime.local();
      };
    
      const date1 = convert(d1.dateDebut);
      const date2 = convert(d2.dateDebut);
    
      const diff = date1.diff(date2);
    
      return diff.as('milliseconds') === 0 ? d1.rank - d2.rank : orderValue * Math.sign(diff.as('milliseconds')));
    }
    

    En el método sortByRangAndDates actualizado, primero convertimos las fechas en objetos DateTime utilizando el método fromISO de Luxon. Luego calculamos la diferencia entre las dos fechas utilizando el método diff, 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.

Comments are closed.