Объясните, как действует код и почему он работает: weirdReverse=a=>a.sort(n=>1)?

Здравствуйте, решаю задачи на CodeWars. Решил попытать удачу и решить задачу на 4 kye, под названием -Reverse it, quickly!. Если сократить, то нужно развернуть массив следуя двум условиям. Первое, без использования reverse(), второе – решение не должно быть длиннее 28 символов.

Задачу я решил вышеперечисленным способом и говоря в прямом смысле, мне просто повезло, поскольку вспомнил, что когда-то видел такой способ. Тем не менее, проблема состоит в том, что я не понимаю, как он действует. CodeWars принял моё решение за правильное, однако если использовать это, например, вывести результат в консоли arr.sort(n=>1), то будет всё тот же массив без надежды на разворот. И также, можете посоветовать, где почитать про подобные конструкции для их понимания?

Ссылка на саму задачу: https://www.codewars.com/kata/59ae589c07157afba80000a7
  • Вопрос задан
  • 576 просмотров
Решения вопроса 1
KaizDA
@KaizDA Автор вопроса
Прочитал одно из возможных объяснений в обсуждении. Поскольку в английском не слишком хорош, могу сделать ошибки. По этой причине, пожалуйста, если был где-то не прав, поправьте, буду благодарен. Ссылка на то, где мной это было прочитано.

В основе своём метод sort(), как уже понятно из названия сортирует массив элементов. При сортировке букв он используется порядок UTF-6, именно по потому он может сортировал от А до Я, предварительно вызывая String для преобразования элементов массива в строку (то же самое происходит и с числами). Исходя из вышеперечисленного, метод sort() сортирует элементы исходя из Unicode. Для сортировки чисел в метод передаётся аргументы, которые очень часто называется (a, b), где проходит сравнение, что => a - b.

В случае с заданием, нам приходится сократить код и использовать только один знак, в моём случае это n. Почему же код действует? Как я понял это происходит потому, что компаратор (как я понял из одного из ответов на просторах в интернете, компаратор – это метод класса, который реализует сравнение объектов, признаки равенства и неравенства коего определяет тот, кто этот класс создал), использует тот факт, что его аргументы передаются слева-направо, из-за чего для многих массивов порядок сортировки такой: [‘A’, ’B’, ’C’, ’D’] => A> B> C> D, что собственно, логично. Следовательно, при перестановке в порядке возрастания – это фактически разворот (этот момент не совсем был мной понят).

Однако, нечто подобное будет работать только для массивов с длиной менее одиннадцать, так как NodeJS переключает алгоритм сортировки для разных размеров массива, хотя это также используется и в других языках (стоит заметить, человек, написавший последнее, не проверял V8, чтобы подтвердить это).
Можно даже сказать, что подобного рода реализация ошибочна, поскольку кроме как в CodeWars код не работает от слова совсем и он вообще не должен был работать. Таким образом, более-менее вероятный ответ – это допущение в NodeJS.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы