Как сделать сортировку массива объектов по ключу js
Чтобы сделать сортировку объектов по ключу, можно воспользоваться тем же методом, как и при обычной сортировке, используя метод sort . Только теперь нужно сравнивать значения в объектах по ключу:
const users = [ name: 'Name2', age: 23, >, name: 'Name3', age: 34, >, name: 'Name1', age: 12, >, ]; const key = 'age'; // ключ, по которому будем сортировать const sorted = users.sort((user1, user2) => user1[key] > user2[key] ? 1 : -1); console.log(sorted); // проверяем результат
05 апреля 2023
Для сортировки массива объектов по ключу с использованием библиотеки Lodash :
const _ = require('lodash'); const cars = [ make: 'Toyota', model: 'Camry', year: 2018 >, make: 'Honda', model: 'Accord', year: 2019 >, make: 'Tesla', model: 'Model S', year: 2020 >, make: 'Ford', model: 'Mustang', year: 2017 >, ]; const sortedCars = _.sortBy(cars, ['year']); console.log(sortedCars);
В этом примере мы создали массив объектов cars , содержащий информацию о машинах, а затем отсортировали его по ключу year с помощью метода _.sortBy() . Результат сортировки мы записали в переменную sortedCars и вывели ее в консоль.
Array.prototype.sort()
Метод sort() на месте сортирует элементы массива и возвращает отсортированный массив. Сортировка не обязательно устойчива (англ.). Порядок сортировки по умолчанию соответствует порядку кодовых точек Unicode.
Синтаксис
arr.sort([compareFunction])
Параметры
Необязательный параметр. Указывает функцию, определяющую порядок сортировки. Если опущен, массив сортируется в соответствии со значениями кодовых точек каждого символа Unicode, полученных путём преобразования каждого элемента в строку.
Возвращаемое значение
Отсортированный массив. Важно, что копия массива не создаётся — массив сортируется на месте.
Описание
Если функция сравнения compareFunction не предоставляется, элементы сортируются путём преобразования их в строки и сравнения строк в порядке следования кодовых точек Unicode. Например, слово «Вишня» идёт перед словом «бананы». При числовой сортировке, 9 идёт перед 80, но поскольку числа преобразуются в строки, то «80» идёт перед «9» в соответствии с порядком в Unicode.
var fruit = ["арбузы", "бананы", "Вишня"]; fruit.sort(); // ['Вишня', 'арбузы', 'бананы'] var scores = [1, 2, 10, 21]; scores.sort(); // [1, 10, 2, 21] var things = ["слово", "Слово", "1 Слово", "2 Слова"]; things.sort(); // ['1 Слово', '2 Слова', 'Слово', 'слово'] // В Unicode, числа находятся перед буквами в верхнем регистре, // а те, в свою очередь, перед буквами в нижнем регистре.
Если функция сравнения compareFunction предоставлена, элементы массива сортируются в соответствии с её возвращаемым значением. Если сравниваются два элемента a и b , то:
- Если compareFunction(a, b) меньше 0, сортировка поставит a по меньшему индексу, чем b , то есть, a идёт первым.
- Если compareFunction(a, b) вернёт 0, сортировка оставит a и b неизменными по отношению друг к другу, но отсортирует их по отношению ко всем другим элементам. Обратите внимание: стандарт ECMAscript не гарантирует данное поведение, и ему следуют не все браузеры (например, версии Mozilla по крайней мере, до 2003 года).
- Если compareFunction(a, b) больше 0, сортировка поставит b по меньшему индексу, чем a .
- Функция compareFunction(a, b) должна всегда возвращать одинаковое значение для определённой пары элементов a и b . Если будут возвращаться непоследовательные результаты, порядок сортировки будет не определён.
Итак, функция сравнения имеет следующую форму:
function compare(a, b) if (a меньше b по некоторому критерию сортировки) return -1; > if (a больше b по некоторому критерию сортировки) return 1; > // a должно быть равным b return 0; >
Для числового сравнения, вместо строкового, функция сравнения может просто вычитать b из a . Следующая функция будет сортировать массив по возрастанию:
function compareNumbers(a, b) return a - b; >
Метод sort можно удобно использовать с функциональными выражениями (и замыканиями):
var numbers = [4, 2, 5, 1, 3]; numbers.sort(function (a, b) return a - b; >); console.log(numbers); // [1, 2, 3, 4, 5]
Объекты могут быть отсортированы по значению одного из своих свойств.
var items = [ name: "Edward", value: 21 >, name: "Sharpe", value: 37 >, name: "And", value: 45 >, name: "The", value: -12 >, name: "Magnetic" >, name: "Zeros", value: 37 >, ]; items.sort(function (a, b) if (a.name > b.name) return 1; > if (a.name b.name) return -1; > // a должно быть равным b return 0; >);
Примеры
Пример: создание, отображение и сортировка массива
В следующем примере создаётся четыре массива, сначала отображается первоначальный массив, а затем они сортируются. Числовые массивы сортируются сначала без, а потом с функцией сравнения.
var stringArray = ["Голубая", "Горбатая", "Белуга"]; var numericStringArray = ["80", "9", "700"]; var numberArray = [40, 1, 5, 200]; var mixedNumericArray = ["80", "9", "700", 40, 1, 5, 200]; function compareNumbers(a, b) return a - b; > // снова предполагаем, что функция печати определена console.log("stringArray:", stringArray.join()); console.log("Сортировка:", stringArray.sort()); console.log("numberArray:", numberArray.join()); console.log("Сортировка без функции сравнения:", numberArray.sort()); console.log( "Сортировка с функцией compareNumbers:", numberArray.sort(compareNumbers), ); console.log("numericStringArray:", numericStringArray.join()); console.log("Сортировка без функции сравнения:", numericStringArray.sort()); console.log( "Сортировка с функцией compareNumbers:", numericStringArray.sort(compareNumbers), ); console.log("mixedNumericArray:", mixedNumericArray.join()); console.log("Сортировка без функции сравнения:", mixedNumericArray.sort()); console.log( "Сортировка с функцией compareNumbers:", mixedNumericArray.sort(compareNumbers), );
Этот пример произведёт следующий вывод. Как показывает вывод, когда используется функция сравнения, числа сортируются корректно вне зависимости от того, являются ли они собственно числами или строками с числами.
stringArray: Голубая,Горбатая,Белуга Сортировка: Белуга,Голубая,Горбатая numberArray: 40,1,5,200 Сортировка без функции сравнения: 1,200,40,5 Сортировка с функцией compareNumbers: 1,5,40,200 numericStringArray: 80,9,700 Сортировка без функции сравнения: 700,80,9 Сортировка с функцией compareNumbers: 9,80,700 mixedNumericArray: 80,9,700,40,1,5,200 Сортировка без функции сравнения: 1,200,40,5,700,80,9 Сортировка с функцией compareNumbers: 1,5,9,40,80,200,700
Пример: сортировка не-ASCII символов
Для сортировки строк с не-ASCII символами, то есть строк с символами акцента (e, é, è, a, ä и т.д.), строк, с языками, отличными от английского: используйте String.localeCompare . Эта функция может сравнивать эти символы, чтобы они становились в правильном порядке.
var items = ["réservé", "premier", "cliché", "communiqué", "café", "adieu"]; items.sort(function (a, b) return a.localeCompare(b); >); // items равен ['adieu', 'café', 'cliché', 'communiqué', 'premier', 'réservé']
Пример: сортировка c помощью map
Функция сравнения (compareFunction) может вызываться несколько раз для каждого элемента в массиве. В зависимости от природы функции сравнения, это может привести к высоким расходам ресурсов. Чем более сложна функция сравнения и чем больше элементов требуется отсортировать, тем разумнее использовать map для сортировки. Идея состоит в том, чтобы обойти массив один раз, чтобы извлечь фактические значения, используемые для сортировки, во временный массив, отсортировать временный массив, а затем обойти временный массив для получения правильного порядка.
// массив для сортировки var list = ["Дельта", "альфа", "ЧАРЛИ", "браво"]; // временный массив содержит объекты с позицией и значением сортировки var mapped = list.map(function (el, i) return index: i, value: el.toLowerCase() >; >); // сортируем массив, содержащий уменьшенные значения mapped.sort(function (a, b) if (a.value > b.value) return 1; > if (a.value b.value) return -1; > return 0; >); // контейнер для результа var result = mapped.map(function (el) return list[el.index]; >);
Спецификации
| Specification |
|---|
| ECMAScript Language Specification # sec-array.prototype.sort |
Совместимость с браузерами
BCD tables only load in the browser
Смотрите также
- Array.prototype.reverse()
- String.prototype.localeCompare()
Как отсортировать массив объектов в javascript
важность: 5
Напишите функцию sortByAge(users) , которая принимает массив объектов со свойством age и сортирует их по нему.
let vasya = < name: "Вася", age: 25 >; let petya = < name: "Петя", age: 30 >; let masha = < name: "Маша", age: 28 >; let arr = [ vasya, petya, masha ]; sortByAge(arr); // теперь: [vasya, masha, petya] alert(arr[0].name); // Вася alert(arr[1].name); // Маша alert(arr[2].name); // Петя
function sortByAge(arr) < arr.sort((a, b) =>a.age > b.age ? 1 : -1); > let vasya = < name: "Вася", age: 25 >; let petya = < name: "Петя", age: 30 >; let masha = < name: "Маша", age: 28 >; let arr = [ vasya, petya, masha ]; sortByAge(arr); // теперь отсортировано: [vasya, masha, petya] alert(arr[0].name); // Вася alert(arr[1].name); // Маша alert(arr[2].name); // Петя
Как отсортировать массив объектов в javascript
Мы хотим сделать этот проект с открытым исходным кодом доступным для людей во всем мире. Пожалуйста, помогите нам перевести это руководство на другие языки.
Светлая тема Тёмная тема
Поделиться
- Учебник
- Язык JavaScript
- Продвинутая работа с функциями
- Область видимости переменных, замыкание
Сортировать по полю
важность: 5
У нас есть массив объектов, который нужно отсортировать:
let users = [ < name: "John", age: 20, surname: "Johnson" >, < name: "Pete", age: 18, surname: "Peterson" >, < name: "Ann", age: 19, surname: "Hathaway" >];
Обычный способ был бы таким:
// по имени (Ann, John, Pete) users.sort((a, b) => a.name > b.name ? 1 : -1); // по возрасту (Pete, Ann, John) users.sort((a, b) => a.age > b.age ? 1 : -1);
Можем ли мы сделать его короче, например вот таким?
users.sort(byField('name')); users.sort(byField('age'));
То есть чтобы вместо функции мы просто писали byField(fieldName) .
Напишите функцию byField , которая может быть использована для этого.
function byField(fieldName) < return (a, b) =>a[fieldName] > b[fieldName] ? 1 : -1; >