Как отсортировать ответ из моего API с условием двух дат, и если у меня нет одного условия, данные должны быть в первом индексе - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно отсортировать возврат из моего API в соответствии с моей StartDate, но я должен создать проверку, если у меня нет FinalDate, данные должны появиться в моем первом индексе.

  1. StartDate: "2004-06-04" FinalDate: "2004-12-17"

  2. StartDate: "1997-08-21" FinalDate: "1998-02-26 "

  3. StartDate:" 1997-08-21 "FinalDate: не определено

Я попытался отсортировать StartDate.Это работает, но то, что я делаю с конечной датой

 this.servidorService.getDesignacoes(this.nomeacaoId).subscribe(
          (response) => {
            if (response.length > 0) {
              this.movimentos = response.sort((a, b) => (b.StartDate< a.StartDate? -1 : b.StartDate> a.StartDate? 1 : 0));
              this.setMovimento();
            }
          },

Проблема в том, что вроде StartDate работает, но если у меня два одинаковых StartDate, один с FinalDate и другой без FinalDate, данные без Final Dateдолжно быть на первом месте.

1 Ответ

0 голосов
/ 13 июня 2019

Зависит от формата ваших дат.Даже если ваш вопрос показывает даты в строковом формате, я начну с предположения об объекте Javascript Date.Итак, предположим, что ваши даты - Javascript Date объекты, вы можете использовать функцию Date:getTime() для сравнения.

// Depending on the origin of your array, your previously Date objects
// now can be JSON Date strings, so you need to convert them back to 
// Dates (for example, you maybe is receiving the array from a rest API)
b.StartDate = new Date(b.StartDate);
a.StartDate = new Date(a.StartDate);

// To get the array in descending order, the comparison should be
// (just switch a and b with each other to get ascending order)
b.StartDate.getTime() - a.StartDate.getTime()

// first of all, make sure that both FinalDate dates are falsy or truthy 
// at the same time... in this case, you should do a regular comparison of 
// StartDate. After that, when you know that one of them isn't a falsy,
// you can return -1 or 1, depending on what you want (nulls at the end or
// a the start of the array):
!!a.FinalDate === !!b.FinalDate // => assure that both FinalDates are falsy or both are truthy
  ? b.StartDate.getTime() - a.StartDate.getTime() 
  : !a.FinalDate 
    ? -1
    : 1 // b.FinalDate is null, so it should come First

Итак, если вы используете обычные Javascript Date объекты, поступающие с сервера (часть «Приведение к дате» может быть пропущена, если вы уверены, что даты являются объектами, а не строками).):

this.servidorService.getDesignacoes(this.nomeacaoId).subscribe((response) => {
  if (response.length > 0) {
    this.movimentos = response.sort((a, b) => {
      b.StartDate = new Date(b.StartDate);
      a.StartDate = new Date(a.StartDate);
      return !!a.FinalDate === !!b.FinalDate
          ? b.StartDate.getTime() - a.StartDate.getTime() 
          : !a.FinalDate ? -1 : 1;
    });
    this.setMovimento();
  }
});

Использование сравнения строк даты

Если вы уверены, что у вас есть даты в виде строк ISO или что-то подобное, вы можете использовать localeCompare() вместо getTime():

this.servidorService.getDesignacoes(this.nomeacaoId).subscribe((response) => {
  if (response.length > 0) {
    this.movimentos = response.sort((a, b) =>
      !!a.FinalDate === !!b.FinalDate
          ? b.StartDate.localeCompare(a.StartDate)
          : !a.FinalDate ? -1 : 1);
    this.setMovimento();
  }
});

Использование сторонних библиотек дат

Если вы используете сторонние библиотеки, такие как momentjs или date-fns, вы также можете использовать их функции сравнения дат вместо вышеуказанныхстроки localeCompare.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...