Задать вопрос

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

Есть массив объектов:
const arr = [
	{name: 'Альберт', surname: 'Эйнштейн'},
	{name: 'Иван', surname: 'Городецкий'},
	{name: 'Чарльз', surname: 'Ксавье'},
	{name: 'Антон', surname: 'Городецкий'},
	{name: 'Альбус', surname: 'Дамблдор'},
]

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

В итоге должно получиться:
[
	{name: 'Антон', surname: 'Городецкий'},
	{name: 'Иван', surname: 'Городецкий'},
	{name: 'Альбус', surname: 'Дамблдор'},
	{name: 'Чарльз', surname: 'Ксавье'},
	{name: 'Альберт', surname: 'Эйнштейн'},
]


Пробую сделать через sort так:
arr.sort((a, b) => {
	if (a.surname > b.surname) return 1;
	if (a.surname < b.surname) return -1;
	if (a.name < b.name) return 1;
	if (a.name > b.name) return -1;
	return 0;
});

Такой вариант не работает
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой 1 комментарий
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Сортируем существующий массив:

arr.sort((a, b) => a.surname.localeCompare(b.surname) || a.name.localeCompare(b.name));

Собираем отсортированный новый:

const sorted = (arr, keys) => arr
  .map(n => [ n ].concat(keys(n)))
  .sort((a, b) => {
    let diff = 0;
    a.find((n, i) => diff = i && ((n < b[i]) ? -1 : +(n > b[i])));
    return diff;
  })
  .map(n => n[0]);


const sortedArr = sorted(arr, n => [ n.surname.toLowerCase(), n.name.toLowerCase() ]);
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы