Войти Регистрация
Фронтенд

89. Сортировка выписки Альфа-Банка по нескольким колонкам

Средняя

В выписке Альфа-Бизнес таблицу сортируют кликом по заголовкам: сначала по контрагенту, внутри — по сумме по убыванию. У части операций контрагента нет (комиссии банка).

Напишите sortRows(rows, spec). spec — массив { key, dir }, dir — 'asc' или 'desc'. Строки сравниваются через localeCompare(…, 'ru'), числа — как числа. Если по первой колонке равенство, решает вторая и так далее; при полном равенстве сохраняется исходный порядок.

null и undefined в колонке всегда уходят в конец, при любом направлении. Вернуть новый массив, rows не менять.

В работе: Выписка на 3 000 операций за квартал: бухгалтер сортирует по контрагенту и сумме перед сверкой.

Пример 1: контрагент, внутри сумма по убыванию

Аргументы теста
[{"id": 1, "who": "Ромашка", "sum": 500}, {"id": 2, "who": "Альфа-Лизинг", "sum": 1200}, {"id": 3, "who": "Ромашка", "sum": 9000}, {"id": 4, "who": "Альфа-Лизинг", "sum": 300}], [{"key": "who", "dir": "asc"}, {"key": "sum", "dir": "desc"}]
Ожидается
{"ids": [2, 4, 3, 1], "same": false, "untouched": true}

Пример 2: пустые в конце при asc

Аргументы теста
[{"id": 1, "who": null, "sum": 50}, {"id": 2, "who": "Берёзка", "sum": 10}, {"id": 3, "who": "Астра", "sum": 20}], [{"key": "who", "dir": "asc"}]
Ожидается
{"ids": [3, 2, 1], "same": false, "untouched": true}
Как проверяем Объявите sortRows — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 8: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function sortRows(rows, spec) // → новый массив
сортировкакомпараторыстабильность

Источник: на задачах Альфа-Банка: выписка по счёту в интернет-банке. Условие пересказано своими словами.