7.8.3. Метод sort()

Метод Array.sort() сортирует элементы в исходном массиве и возвращает отсортированный массив. Если метод sort() вызывается без аргументов, сортировка выполняется в алфавитном порядке (для сравнения элементы временно преобразуются в строки, если это необходимо):

var а = new Array("banana", "cherry", "apple");

a.sort();

var s = a.join(", ”); // s == "apple, banana, cherry"

Неопределенные элементы переносятся в конец массива.

Для сортировки в каком-либо ином порядке, отличном от алфавитного, методу sort() можно передать функцию сравнения в качестве аргумента. Эта функция устанавливает, какой из двух ее аргументов должен следовать раньше в отсортированном списке. Если первый аргумент должен предшествовать второму, функция сравнения должна возвращать отрицательное число. Если первый аргумент должен следовать за вторым в отсортированном массиве, то функция должна возвращать число больше нуля. А если два значения эквивалентны (т. е. порядок их следования не важен), функция сравнения должна возвращать 0. Поэтому, например, для сортировки элементов массива в числовом порядке можно сделать следующее:

var а = [33, 4, 1111, 222];

a.sortO;               // Алфавитный порядок: 1111, 222, 33, 4

a.sort(function(a,b) { // Числовой порядок: 4, 33, 222, 1111

    return a-b;         // Возвращает значение < 0, 0 или > 0

  }); //в зависимости от порядка сортировки а и b

a.sort(function(a,b) {return b-a}); // Обратный числовой порядок

Обратите внимание, насколько удобно использовать в этом фрагменте неименованную функцию. Функция сравнения используется только здесь, поэтому нет необходимости давать ей имя.

В качестве еще одного примера сортировки элементов массива можно реализовать сортировку массива строк без учета регистра символов, передав функцию сравнения, преобразующую свои аргументы в нижний регистр (с помощью метода toLowerCase()) перед сравнением.

а = ['ant', 'Bug', 'cat', 'Dog']

a.sort(); // сортировка с учетом регистра символов: [ 'Bug', 'Dog', 'ant', 'cat' ]

a.sort(function(s,t) { // Сортировка без учета регистра символов

    var а = s.toLowerCase();

    var b = t.toLowerCase();

    if (a < b) return -1;

    if (a > b) return 1;

    return 0;

  }); //=>['ant','Bug','cat'.'Dog']