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

Помимо добавления и удаления элементов массива, часто возникает необходимость отсортировать их в определенном порядке. Для этих случаев также существует целый набор специальных методов.

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

Метод sort() сортирует массив в алфавитном порядке:


var fruits = ["Банан", "Апельсин", "Яблоко", "Манго"];
fruits.sort();            // Сортирует элементы массива fruits 

Реверс массива

Метод reverse() изменяет порядок элементов массива на обратный.

Этот метод можно использовать для сортировки массива в обратном порядке:


var fruits = ["Банан", "Апельсин", "Яблоко", "Манго"];
fruits.sort();            // Сортирует элементы массива fruits 
fruits.reverse();         // Разворачивает элементы в обратном порядке

Числовая сортировка

По умолчанию, метод sort() сортирует значения элементов массива как строки.

Это хорошо работает со строковыми значениями ("Апельсин" встанет перед "Банан"). Однако, если сортировать числа как строки, то "25" будет больше "100", потому что строка "2" больше строки "1".

Таким образом, метод sort() даст неверный результат при сортировке числовых значений.

Решить эту проблему можно при помощи функции сравнения:


var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) { return a - b }); 

Этот же трюк можно использовать для сортировки числовых значений в обратном порядке:


var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) { return b - a }); 

Функция сравнения

Цель функции сравнения — определить альтернативный порядок сортировки.

Функция сравнения в зависимости от параметров должна возвращать отрицательное значение, ноль или положительное значение:


function(a, b) {
   return a-b
}

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

Пример:
Сравнивая значения 40 и 100, метод sort() вызывает функцию сравнения function(40,100). Функция вычисляет выражение 40-100 и возвращает -60 (отрицательное значение). В результате метод sort() определяет 40 как значение меньше 100.

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


<button onclick="myFunction1()">Алфавитная сортировка</button>
<button onclick="myFunction2()">Числовая сортировка</button>

<p id="demo"></p>

<script>
 var points = [40, 100, 1, 5, 25, 10];
 document.getElementById("demo").innerHTML = points;

function myFunction1() {
    points.sort();
    document.getElementById("demo").innerHTML = points;
}

function myFunction2() {
    points.sort(function(a, b){return a - b});
    document.getElementById("demo").innerHTML = points;
}
</script>

Сортировка массива в случайном порядке


var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b) { return 0.5 - Math.random() });

Поиск наибольшего/наименьшего значения в массиве

В массиве нет встроенных функций для поиска максимального или минимального значения.

Тем не менее, после того как вы отсортировали массив, вы можете извлечь наибольшее и наименьшее значения.

Сортировка по возрастанию:


var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// теперь points[0] содержит наименьшее значение
// а points[points.length-1] содержит наибольшее значение

Сортировка по убыванию:


var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// теперь points[0] содержит наибольшее значение
// а points[points.length-1] содержит наименьшее значение

Однако, сортировка всего массива только ради того, чтобы найти наибольшее (или наименьшее) значение, является крайне неэффективным способом сделать это.

Использование Math.max() с массивом

Для поиска наибольшего числа в массиве можно воспользоваться методом Math.max.apply:


function myArrayMax(arr) {
     return Math.max.apply(null, arr);
} 

Math.max.apply([1, 2, 3]) эквивалентно Math.max(1, 2, 3).

Использование Math.min() с массивом

Для поиска наименьшего числа в массиве можно воспользоваться методом Math.min.apply:


function myArrayMin(arr) {
     return Math.min.apply(null, arr);
} 

Math.min.apply([1, 2, 3]) эквивалентно Math.min(1, 2, 3).

Свой Min/Max метод

Самым быстрым решением является использование "самодельной" функции.

В следующей функции в цикле проходим по массиву, сравнивая каждое значение, пока не будет найдено наибольшее:

Пример (Поиск максимального значения)


function myArrayMax(arr) {
    var len = arr.length
    var max = -Infinity;
    while (len--) {
        if (arr[len] > max) {
            max = arr[len];
        }
    }
    return max;
}

В следующей функции в цикле проходим по массиву, сравнивая каждое значение, пока не будет найдено наименьшее:

Пример (Поиск минимального значения)


function myArrayMin(arr) {
    var len = arr.length
    var min = Infinity;
    while (len--) {
        if (arr[len] 

Сортировка массива объектов

Часто массивы JavaScript содержат объекты:


var cars = [
 {type:"Volvo", year:2016},
 {type:"Saab", year:2001},
 {type:"BMW", year:2010}
];

Даже если в объектах есть свойства с разными типами данных, метод sort() все равно может использоваться для сортировки такого массива.

Решение состоит в написании функции сравнения для значений свойств:


cars.sort(function(a, b){return a.year - b.year});

Сравнение свойств строкового типа будет немного более сложным:


cars.sort(function(a, b){
    var x = a.type.toLowerCase();
    var y = b.type.toLowerCase();
    if (x  y) {return 1;}
    return 0;
});