Метод .sort() немного отличается от того, что вы ожидаете. Возьмем массив и применим к нему метод
let array1 = [1, 30, 4, 21, 100000];
array1.sort();
console.log(array1);
Таким образом, мы ожидаем, что вывод должен быть
[ 1, 4, 21, 30, 100000 ]
но происходит следующее
[ 1, 100000, 21, 30, 4 ]
Функция сравнения
Но почему это происходит, когда вы читаете документацию, вы можете видеть, что мы можем передать функцию в качестве аргумента, но если мы не передаем функцию, то элементы массива преобразуются в строки, а затем сортируются в соответствии со значением кодовой точки Unicode для каждого символа.
All non-undefined array elements are sorted by converting them to strings and comparing strings in UTF-16 code units order. For example, "banana" comes before "cherry". In a numeric sort, 9 comes before 80, but because numbers are converted to strings, "80" comes before "9" in the Unicode order.
Давайте поговорим об этой функции, в основном она известна как функция сравнения. Функция сравнения предназначена для определения альтернативного порядка сортировки. Функция сравнения должна возвращать отрицательное, нулевое или положительное значение в зависимости от аргументов:
function compareFunction(a,b){ return a-b }
Теперь посмотрите, как работает приведенный выше код с помощью функции compareFunction.
let array1 = [1, 30, 4, 21, 100000]; array1.sort(compareFunction); console.log(array1);
[ 1, 4, 21, 30, 100000 ]
Что именно происходит
Когда функция sort() сравнивает два значения, она отправляет значения в функцию сравнения и сортирует значения в соответствии с возвращенным значением (отрицательным, нулевым, положительным).
- Если результат отрицательный, a сортируется перед b.
- Если результат положительный, b сортируется перед a.
- Если результат равен 0, порядок сортировки двух значений не изменяется.
Например,
When comparing 40 and 100, the sort() method calls the compare function(40, 100). The function calculates 40 - 100 (a - b), and since the result is negative (-60), the sort function will sort 40 as a value lower than 100.
Итак, чтобы получить массив в порядке убывания, нам просто нужно изменить возвращаемое значение как b-a
// This will give a Descending order array
function comparFunction(a,b){ return b-a }
compareFunction для массива объектов
Таким образом, массив объектов ничем не отличается от массива чисел или массива строк. В приведенном выше примере a и b — не что иное, как числовые типы данных. Итак, теперь это будет объект.
var Staff = [{
"id": 1,
"name": "Joellyn Manktelow"
}, {
"id": 10,
"name": "Roxine MacGorley"
},{
"id": 3,
"name": "Taddeusz Colthard"
}, {
"id": 4,
"name": "Elysia Drains"
}, {
"id": 6,
"name": "Curtice Curragh"
}, {
"id": 7,
"name": "Dael Sylett"
}, {
"id": 2,
"name": "Lorin Janak"
}, {
"id": 8,
"name": "Patty Matuschek"
}, {
"id": 9,
"name": "Kandace Sorensen"
}, {
"id": 5,
"name": "Rona Cresser"
}];
Затем мы можем использовать тип данных a.id или число. Следовательно, мы можем сортировать по имени или идентификатору.
// when we want to sort using id console.log('when we want to sort using id') Staff.sort(function(a, b){return a.id - b.id}); console.log(Staff)
when we want to sort using id [ { id: 1, name: 'Joellyn Manktelow' }, { id: 2, name: 'Lorin Janak' }, { id: 3, name: 'Taddeusz Colthard' }, { id: 4, name: 'Elysia Drains' }, { id: 5, name: 'Rona Cresser' }, { id: 6, name: 'Curtice Curragh' }, { id: 7, name: 'Dael Sylett' }, { id: 8, name: 'Patty Matuschek' }, { id: 9, name: 'Kandace Sorensen' }, { id: 10, name: 'Roxine MacGorley' } ]
Но если вы хотите отсортировать по имени или строковому типу данных, лучше всего использовать String.prototype.localeCompare() для сравнения двух строк. давайте возьмем приведенный выше массив сотрудников
// when we want to sort using id console.log('when we want to sort using Name') Staff.sort(function(a, b){return a.name.localeCompare(b.name)}); console.log(Staff)
when we want to sort using Name [ { id: 6, name: 'Curtice Curragh' }, { id: 7, name: 'Dael Sylett' }, { id: 4, name: 'Elysia Drains' }, { id: 1, name: 'Joellyn Manktelow' }, { id: 9, name: 'Kandace Sorensen' }, { id: 2, name: 'Lorin Janak' }, { id: 8, name: 'Patty Matuschek' }, { id: 5, name: 'Rona Cresser' }, { id: 10, name: 'Roxine MacGorley' }, { id: 3, name: 'Taddeusz Colthard' } ]
Таким образом, для сравнения двух строк мы можем использовать метод localeCompare строкового типа данных, который возвращает отрицательное число, если a.first_name встречается до b.first_name, положительное, если a.first_name встречается после b.first_name; 0, если они эквивалентны.
Спасибо!!