Решён
Помогите решить задачу по программированию - сортировка массива объектов

TS Lover JavaScript
3.7k
6

Всем привет. Есть задача с собеседования, не могу решить.

Дан массив объектов (JavaScript):

const users = [
  { name: 'Alice', age: 25, salary: 50000 },
  { name: 'Bob', age: 30, salary: 60000 },
  { name: 'Charlie', age: 25, salary: 55000 },
  { name: 'David', age: 30, salary: 60000 }
];

Нужно отсортировать массив по двум критериям:

  1. Сначала по возрасту (по возрастанию)
  2. Если возраст одинаковый - по зарплате (по убыванию)

Ожидаемый результат:

[
  { name: 'Charlie', age: 25, salary: 55000 },
  { name: 'Alice', age: 25, salary: 50000 },
  { name: 'Bob', age: 30, salary: 60000 },
  { name: 'David', age: 30, salary: 60000 }
]

Пытался через sort() но не получается правильно сравнить два поля. Подскажите решение?

Решение
77
Участник • 3 ответа
const sorted = users.sort((a, b) => {
  if (a.age !== b.age) {
    return a.age - b.age;
  }
  return b.salary - a.salary;
});

Логика:

  1. Сравниваем age. Если не равны - возвращаем разницу (сортировка по возрастанию)
  2. Если age равны - сравниваем salary в обратном порядке (b - a для убывания)
Аватар TS Lover

Спасибо! Работает

12
Эксперт • 2 ответа

А если нужна сортировка по трем и более полям, лучше использовать библиотеку lodash:

javascript">const _ = require('lodash');
const sorted = _.orderBy(users, ['age', 'salary'], ['asc', 'desc']);

Более декларативно и понятно что происходит.

Аватар Олег Тревожный

На собеседовании скорее всего ждут решение без библиотек, чистый JS

53
Участник • 2 ответа

Можно еще через цепочку сравнений в одну строку:

users.sort((a, b) => a.age - b.age || b.salary - a.salary);

Работает за счет того, что если a.age - b.age равно 0 (возраст одинаковый), то оператор || возвращает второе значение b.salary - a.salary.

Более лаконично, но менее читаемо для новичков.

18
Участник • 2 ответа

Обрати внимание что твой ожидаемый результат неправильный.

При сортировке по возрасту (возрастание) и зарплате (убывание) для age=25:

  • Charlie (salary 55000) должен быть ПЕРВЫМ
  • Alice (salary 50000) - вторым

Ты правильно указал порядок. Но для age=30 Bob и David имеют одинаковую зарплату 60000, поэтому их взаимный порядок не определен (stable sort не гарантирован в JS).

25
Участник • 1 ответ

кстати метод sort() мутирует исходный массив, если нужен новый массив лучше сначала сделать копию

const sorted = [...users].sort((a, b) => a.age - b.age || b.salary - a.salary);
29
Участник • 1 ответ

На собеседованиях по JS часто спрашивают сложность алгоритма сортировки.

Метод sort() в V8 (движок Chrome/Node.js) использует Timsort - гибридный алгоритм между merge sort и insertion sort. Временная сложность O(n log n) в худшем случае, пространственная O(n).

Если интервьюер спросит - будешь знать.

Написать ответ

Премодерация гостей

Вы отвечаете как гость. Ваш ответ будет скрыт до проверки модератором. Чтобы ответ появился сразу и вы получали репутацию — войдите в аккаунт.

Будьте вежливы и соблюдайте правила платформы.