Сортировка в createSelector не работает при комбинировании нескольких условий сортировки

Я использую createSelector из Redux Toolkit для фильтрации и сортировки списка пользователей. Сортировка по фамилии или ID работает нормально по отдельности, но когда я пытаюсь применить обе одновременно, одно из условий сортировки игнорируется.

import { createSelector } from "@reduxjs/toolkit";

const selectUsers = (state) => state.client.client;

const selectSearchClient = (state) => state.client.searchClient;
const selectSurnameClient = (state) => state.client.surnameSortFlag;
const selectIdClient = (state) => state.client.idSortFlag;

export const selectFilterClients = createSelector(
  [selectUsers, selectSearchClient, selectSurnameClient, selectIdClient],
  (users, filter, surnameSortFlag, idSortFlag) => {
    const filterClients = users.filter((user) =>
      user.surname.toLowerCase().includes(filter.toLowerCase())
    );

    const sortedClients = [...filterClients].sort((a, b) => {
      if (!surnameSortFlag && !idSortFlag) {
        return a.surname.localeCompare(b.surname) || a.id - b.id;
      }
      if (!surnameSortFlag) {
        return a.surname.localeCompare(b.surname);
      }
      if (!idSortFlag) {
        return a.id - b.id;
      }
      return 0;
    });

    return sortedClients;
  }
);

Как правильно применить оба условия сортировки одновременно?


Ответы (1 шт):

Автор решения: ksa

Как правильно применить оба условия сортировки одновременно?

Сначала нужно проверить на "больше/меньше" главный критерий... При равенстве - вернуть проверку второго критерия.

Вот небольшой пример...

const a = [
  {id: 5, name: 'Аня'},
  {id: 1, name: 'Света'},
  {id: 3, name: 'Таня'},
  {id: 4, name: 'Вика'},
  {id: 2, name: 'Юля'},
  {id: 6, name: 'Катя'},
]
a.sort((a, b) => {
  const v = a.name.localeCompare(b.name, 'ru')
  return v ? v : a.id - b.id
})
console.log(a)

→ Ссылка