Рубрики
Без рубрики

Сортировка массивов в JavaScript

Как и многие другие языки, JavaScript предлагает удобные методы для сортировки массивов. Хотя результат такой же, двигатели JavaScript реализуют различные алгоритмы, которые мы будем покрывать в этой статье.

Автор оригинала: 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. Это относится к любому типу данных, включая строки, цифры или даже объекты. Порядок сортировки определяется Сравнение Метод обратного вызова, который позволяет вам определить порядок сортировки или какие объектные свойства определяют порядок сортировки.