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

Как упорядочить массив сначала по значению status_sitter, а затем по значению status_date внутри каждого значения status_sitter при помощи JavaScript?
  • 4 февраля 2024 г. 15:18
Ответы на вопрос 3
Чтобы отсортировать массив объектов по нескольким критериям в JavaScript, вы можете использовать функцию `.sort()` с функцией сравнения, которая учитывает несколько полей объектов. Вот пример такой функции для сортировки массива сначала по `status_sitter`, а затем по `status_date`:

```javascript
const arrayOfObjects = [
  { status_sitter: 'active', status_date: '2021-04-22' },
  { status_sitter: 'inactive', status_date: '2021-05-01' },
  { status_sitter: 'active', status_date: '2021-04-20' },
  { status_sitter: 'inactive', status_date: '2021-05-05' },
  // ... другие объекты
];

// Сортировка по полю status_sitter и затем по полю status_date
arrayOfObjects.sort((a, b) => {
  // Сравнение по status_sitter
  if (a.status_sitter < b.status_sitter) {
    return -1;
  }
  if (a.status_sitter > b.status_sitter) {
    return 1;
  }
  // Если status_sitter одинаковый, то сравниваем по status_date
  if (a.status_date < b.status_date) {
    return -1;
  }
  if (a.status_date > b.status_date) {
    return 1;
  }
  // Если оба критерия одинаковы, возвращаем 0
  return 0;
});

console.log(arrayOfObjects);
```

В этом примере используется лексикографическое сравнение строк. Если `status_date` представляет собой дату в виде строки в формате ISO (как в примере), то такое сравнение будет корректно сортировать даты, потому что ISO формат представляет даты в порядке от года к дню (`YYYY-MM-DD`), что подходит для лексикографической сортировки. Если даты не в формате ISO, возможно потребуется преобразование строк в объекты Date и их сравнение:

```javascript
arrayOfObjects.sort((a, b) => {
  // Сравнение по status_sitter
  if (a.status_sitter < b.status_sitter) {
    return -1;
  }
  if (a.status_sitter > b.status_sitter) {
    return 1;
  }
  // Если status_sitter одинаковый, то сравниваем по status_date
  const dateA = new Date(a.status_date);
  const dateB = new Date(b.status_date);
  return dateA - dateB;
});

console.log(arrayOfObjects);
```

Важно отметить, что метод `sort` сортирует массив на месте, то есть изменяет исходный массив. Если вам нужно сохранить исходный порядок элементов и создать отсортированную копию, сначала сделайте копию массива (например, используя оператор распространения `...`), а затем отсортируйте эту копию.

В итоге может выглядеть так:

Если даты записаны строками, то так: 
Похожие вопросы