Массивы сортировки JavaScript
Сортировка массива
Метод sort()
сортирует массив по алфавиту:
Пример
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
Реверс массива
Метод reverse()
переворачивает элементы в массиве.
Вы можете использовать его для сортировки массива в порядке убывания:
Пример
const fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();
Числовая сортировка
По умолчанию sort()
функция сортирует значения как строки .
Это хорошо работает для строк ("Apple" предшествует "Banana").
Однако, если числа отсортированы как строки, «25» больше, чем «100», потому что «2» больше, чем «1».
Из-за этого sort()
метод будет давать неверный результат при сортировке чисел.
Вы можете исправить это, предоставив функцию сравнения :
Пример
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
Используйте тот же трюк для сортировки массива по убыванию:
Пример
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
Функция сравнения
Функция сравнения предназначена для определения альтернативного порядка сортировки.
Функция сравнения должна возвращать отрицательное, нулевое или положительное значение в зависимости от аргументов:
function(a, b){return a - b}
Когда sort()
функция сравнивает два значения, она отправляет значения функции сравнения и сортирует значения в соответствии с возвращенным значением (отрицательным, нулевым, положительным).
Если результат отрицательный a
, сортируется до
b
.
Если результат положительный b
, сортируется раньше a
.
Если результат равен 0, порядок сортировки двух значений не изменяется.
Пример:
Функция сравнения сравнивает все значения в массиве, по два значения за раз (a, b)
.
При сравнении 40 и 100 sort()
метод вызывает функцию сравнения (40, 100).
Функция вычисляет 40 - 100 (a - b)
, и, поскольку результат отрицательный (-60), функция сортировки отсортирует 40 как значение меньше 100.
Вы можете использовать этот фрагмент кода, чтобы поэкспериментировать с числовой и алфавитной сортировкой:
<button onclick="myFunction1()">Sort Alphabetically</button>
<button
onclick="myFunction2()">Sort Numerically</button>
<p id="demo"></p>
<script>
const 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>
Сортировка массива в случайном порядке
Пример
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return 0.5 - Math.random()});
Метод Фишера Йейтса
Приведенный выше пример, массив .sort(), не точен, он будет отдавать предпочтение одним числам над другими.
Самый популярный правильный метод называется перетасовкой Фишера-Йейтса и был введен в науку о данных еще в 1938 году!
В JavaScript метод можно перевести так:
Пример
const points = [40, 100, 1, 5, 25, 10];
for (let i = points.length -1; i > 0;
i--) {
let j = Math.floor(Math.random() * i)
let k = points[i]
points[i] = points[j]
points[j] = k
}
Найдите самое высокое (или самое низкое) значение массива
Встроенных функций для нахождения максимального или минимального значения в массиве нет.
Однако после сортировки массива можно использовать индекс для получения наибольшего и наименьшего значений.
Сортировка по возрастанию:
Пример
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
// now points[0] contains the lowest value
// and points[points.length-1] contains the highest value
Сортировка по убыванию:
Пример
const points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return b - a});
// now points[0] contains the highest value
// and points[points.length-1] contains the lowest value
Сортировка всего массива — очень неэффективный метод, если вы хотите найти только самое высокое (или самое низкое) значение.
Использование Math.max() в массиве
Вы можете использовать Math.max.apply
, чтобы найти наибольшее число в массиве:
Пример
function myArrayMax(arr) {
return Math.max.apply(null, arr);
}
Math.max.apply(null, [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(null, [1, 2, 3])
эквивалентно Math.min(1, 2, 3)
.
Мои минимальные/максимальные методы JavaScript
Самое быстрое решение — использовать «домашний» метод.
Эта функция перебирает массив, сравнивая каждое значение с наибольшим найденным значением:
Пример (найти макс.)
function myArrayMax(arr) {
let len = arr.length;
let max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
}
Эта функция перебирает массив, сравнивая каждое значение с наименьшим найденным значением:
Пример (найти минимум)
function myArrayMin(arr) {
let len = arr.length;
let min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
}
Сортировка массивов объектов
Массивы JavaScript часто содержат объекты:
Пример
const 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){
let x = a.type.toLowerCase();
let y = b.type.toLowerCase();
if (x < y) {return -1;}
if (x > y) {return 1;}
return 0;
});
Полный справочник массивов
Полную справку по массивам см. на странице:
Полный справочник по массивам JavaScript .
Справочник содержит описания и примеры всех свойств и методов массива.