Автор оригинала: Scott Robinson.
Как и многие другие популярные языки, JavaScript удобно поставляется со встроенным методом для сортировки массивов. Хотя конечный результат одинаковы, различные двигатели JavaScript реализуют этот метод с использованием различных алгоритмов сортировки:
- V8: QuickSort или STORMENT (для небольших массивов)
- Firefox: Сортировка слияния
- Safari: Quicksort, Сортировка слияния или Сортировка выбора (в зависимости от типа массива)
Реализация не имеет значения для призвающего кода, но интересно увидеть эти алгоритмы сортировки, используемые на практике после изучения о них для них так долго в классах CS Intro.
Эта функция сортировки доступна в качестве метода прототипа на Массив
класс:
Array.sort([compareFunc])
В True JavaScript мода обратный вызов передается на эту функцию, которая используется для того, чтобы сообщить алгоритму сортировки, как два элемента сравниваются друг с другом. Сравнение
должен иметь два параметра, А
и B
и работает так:
- Если
Сравнение
Возвращает 0, затем элементы рассматриваются как равные - Если
Сравнение
Возвращает 1, тогдаB
отсортирован доа.
- Если
Сравнение
Возвращает -1 ТогдаА
отсортирован допреступник
Функция не обязательно должна возвращать 1 или -1, так же, как и возвращаемые номера 0, выше 0 или ниже 0. Таким образом, функция компаратора, такая как (a, b) => a - b;
совершенно действует.
Если Сравнение
Не дается, то элементы преобразуются в строки, а затем сортируются в алфавитном порядке. Это делает сортировочные струны тривиальными. Однако во время сортировки чисел кажется, что это должно быть прямо вперед, на самом деле он может быть немного запутанным здесь:
> let nums = [3, 2, 6, 50, 10]; > nums.sort() [ 10, 2, 3, 50, 6 ]
Как видите, числа не в том порядке, что вы ожидали. Это связано с тем, что, как упоминалось ранее, метод сортировки по умолчанию должен преобразовать элементы в строки перед сравнением. И как строка, «50» наступает раньше «6», поэтому 50 не длится в массиве. Чтобы правильно отсортировать этот массив, вместо этого попробуйте следующее:
> let nums = [3, 2, 6, 50, 10]; > nums.sort((a, b) => a - b); [ 2, 3, 6, 10, 50 ]
Примечание : Важно помнить, что этот метод сортирует на месте , что означает, что исходный массив на самом деле отсортирован, и копия не сделана. Итак, пока .sort ()
Метод возвращает отсортированный массив, на самом деле вам на самом деле не нужно назначать его с момента массива, который оно вызывается, сортируется.
Если вы хотите изменить порядок сортировки, просто переключите сравнение А
и B
Отказ Поэтому, если мы хотим, чтобы количество было в порядке убывания, вы сделаете следующее:
> let nums = [3, 2, 6, 50, 10]; > nums.sort((a, b) => b - a); [ 50, 10, 6, 3, 2 ]
Сортировка массива объектов
Использование функции компаратора, как это, делает его чрезвычайно легко сортировать пользовательские объекты в JavaScript. Например, скажем, у нас есть следующий список пользовательских данных:
let users = [ {name: 'Scotty', age: '18'}, {name: 'Tommy', age: '21'}, {name: 'Sally', age: '71'}, {name: 'Billy', age: '18'}, {name: 'Timmy', age: '21'} ];
Это не то, что алгоритм сортировки может просто интерпретировать и сортировать себя. Заказ также сильно зависит от приложения. Что если мы хотим отсортировать по возрасту и Тогда название? Для этого мы могли бы предоставить компаратор, который объединяет два:
users.sort((a, b) => { let keyA = a.age + a.name; let keyB = b.age + b.name; if (keyA < keyB) return -1; if (keyA > keyB) return 1; return 0; });
Это приведет к следующему отсортированному массиву:
[ { name: 'Billy', age: '18' }, { name: 'Scotty', age: '18' }, { name: 'Timmy', age: '21' }, { name: 'Tommy', age: '21' }, { name: 'Sally', age: '71' } ]
Обратите внимание, что все пользователи теперь отсортированы по возрасту. И как предполагалось, эти пользователи с тем же возрастом сортируются по имени, такие как Билли и Скотти.
Заключение
В этой короткой статье мы видели, как использовать встроенный .sort ()
Метод легко сортировать массивы в JavaScript. Это относится к любому типу данных, включая строки, цифры или даже объекты. Порядок сортировки определяется Сравнение
Метод обратного вызова, который позволяет вам определить порядок сортировки или какие объектные свойства определяют порядок сортировки.