Как отсортировать массив объектов по нескольким полям
Короткий ответ
Сравните по первому полю, а если оно равно — по второму. Оператор || переходит дальше, когда результат равен 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 — Возвращает отсортированную копию массива, не меняя исходный.