Сортировка различных объектов в объединенный список в Typescript

#angular #typescript

Вопрос:

У меня есть 2 массива различных объектов, которые я хотел бы отсортировать по дате в моем приложении Angular.

Объект 1:

Идентификатор назначения: номер, Дата назначения: Дата

Объект 2:

Идентификатор отмены: номер, Дата отмены: Дата

Следующий код сортируется по дате встречи, как я могу одновременно сортировать данные об отмене, чтобы у меня был объединенный отсортированный список?

 let appointments = this.appointmentService.getAppointmentsForJob(this.jobId);
let cancellations = this.cancellationService.getCancellationsForJob(this.jobId);

forkJoin([appointments, cancellations]).subscribe(results => {
  this.appointments = results[0];
  this.cancellations = results[1];
  this.loading = false;
  this.combinedItems = ([]).concat(this.appointments, this.cancellations);
  this.combinedItems = this.combinedItems.sort((a, b) => a.appointmentDate - b.appointmentDate);
  console.log(this.combinedItems);

});
 

Ответ №1:

Вы должны знать, какое свойство имеет «более высокий» приоритет при сортировке, я поставил его в том порядке, который вы указали. Сначала назначьте дату, затем отмените.

 forkJoin([appointments, cancellations]).subscribe(results => {

  [this.appointments, this.cancellations] = results;

  this.loading = false;

  this.combinedItems = [...this.appointments, ...this.cancellations];

  const compareFn = (a: any, b: any) => {
      const compareByAppDate = a.appointmentDate - b.appointmentDate;
      const compareByCancelDate = a.cancelDate - b.cancelDate;
      return compareByAppDate || compareByCancelDate;
  }
   
  this.combinedItems = this.combinedItems.sort(compareFn)
  console.log(this.combinedItems);

});
 

Ответ №2:

если вы хотите использовать обе даты одновременно, вы можете изменить функцию сортировки следующим образом:

 this.combinedItems = this.combinedItems.sort((a, b) => {
  const dateA = a.appointmentDate || a.cancelDate;
  const dateB = b.appointmentDate || b.cancelDate;
  return dateA - dateB
});