Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

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

Короткий ответ

Сравните по первому полю, а если оно равно — по второму. Оператор || переходит дальше, когда результат равен 0:

const users = [
  { name: 'Oleg', city: 'Paris' },
  { name: 'Anna', city: 'Rome' },
  { name: 'Maria', city: 'Paris' },
];
 
users.sort((a, b) => a.city.localeCompare(b.city) || a.name.localeCompare(b.name));
 
console.log(users.map((u) => `${u.city} ${u.name}`).join(', '));

Результат:

Paris Maria, Paris Oleg, Rome Anna

Числа и обратный порядок

Для чисел вычитайте. Чтобы развернуть одно поле, поменяйте a и b только для него:

const players = [
  { name: 'Anna', score: 90 },
  { name: 'Oleg', score: 75 },
  { name: 'Ivan', score: 90 },
];
 
players.sort((a, b) => b.score - a.score || a.name.localeCompare(b.name));
 
console.log(players.map((p) => `${p.name} ${p.score}`).join(', '));

Результат:

Anna 90, Ivan 90, Oleg 75

Не меняя исходный

toSorted() возвращает отсортированную копию:

const prices = [30, 10, 20];
const sorted = prices.toSorted((a, b) => a - b);
 
console.log(prices.join(), sorted.join());

Результат:

30,10,20 10,20,30

Частая ошибка

sort() без функции сравнивает значения как строки, поэтому 10 оказывается раньше 9:

console.log([9, 10, 1].sort().join(', '));

Результат:

1, 10, 9

Функции из этого ответа

  • Array.prototype.sort — Сортирует элементы массива.
  • String.prototype.localeCompare — Сравнивает строки по правилам языка — для сортировки по алфавиту.
  • Array.prototype.toSorted — Возвращает отсортированную копию массива, не меняя исходный.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.