У меня есть массив таких объектов. Я пытаюсь отсортировать массив, если у праздников одинаковый holiday_on, и Сортировать по holiday_for по убыванию.

const holidays: IHoliday[] = [
    {
        id: 1,
        holiday_for: 1,
        holiday_on: "2021-10-26"
    },
    {
        id: 2,
        holiday_for: 3,
        holiday_on: "2021-10-26"
    },
    {
        id: 3,
        holiday_for: 1,
        holiday_on: "2021-11-26"
    },
    {
        id: 4,
        holiday_for: 3,
        holiday_on: "2021-11-26"
    },
    {
        id: 5,
        holiday_for: 4,
        holiday_on: "2021-11-26"
    }
]

В реализации ниже возникает ошибка этого типа Argument of type '(a: IHoliday, b: IHoliday) => number | undefined' is not assignable to parameter of type '(a: IHoliday, b: IHoliday) => number'.Type 'number | undefined' is not assignable to type 'number'

Если я сделаю массив праздников любого типа, машинопись даст еще одно предупреждение - Not all code paths return a value.

Реализация

const sorted = holidays.sort((a: IHoliday, b: IHoliday) => {
    if (a.holiday_on === b.holiday_on) {
        return b.holiday_for - a.holiday_for;
    }
});
0
RAHUL KUNDU 17 Сен 2021 в 05:46

2 ответа

Лучший ответ

Я добавил еще один возврат, чтобы, если holiday_on не совпадает, он будет отсортировать дату, но вы не можете напрямую выполнить операцию с типом Date в Typescript. Использование метода getTime () преобразует дату в число (Date.prototype.getTime ()), чтобы вы могли выполнить операцию без ошибок.

const sorted = this.holidays.sort((a: IHoliday, b: IHoliday) => {
  if (a.holiday_on === b.holiday_on) {
    return b.holiday_for - a.holiday_for;
  }
  return (
    new Date(b.holiday_on).getTime() - new Date(a.holiday_on).getTime()
  );
});
console.log(sorted);

Я добавил stackblitz, чтобы вы могли поиграть на.

1
dom.macs 17 Сен 2021 в 03:38

Ваша функция сортировки всегда должна возвращать число. 0, если равно, >=1, если больше, и <=-1, если меньше.

const sorted = holidays.sort((a: IHoliday, b: IHoliday) => {
    if (a.holiday_on === b.holiday_on) {
        return b.holiday_for - a.holiday_for;
    }
    return new Date(b.holiday_on) - new Date(a.holiday_on)
});

Эта функция сначала попытается выполнить сортировку по holiday_on, и только если они равны, она будет сортировать по holiday_for.

0
aelesia 17 Сен 2021 в 02:56