
В JavaScript объекты внутри массива обычно сравниваются не напрямую, а по значению конкретных свойств. Это позволяет структурировать данные, например, упорядочить список пользователей по возрасту или товары по цене. Для этого используется метод Array.prototype.sort(), который принимает функцию сравнения и возвращает тот же массив в изменённом виде.
Ключевой момент – правильно определить критерий сравнения. Если свойство имеет числовое значение, функция должна возвращать разницу между ними. При работе со строками необходимо использовать методы localeCompare() или перевод в нижний регистр, чтобы избежать ошибок сортировки, связанных с регистром и локалью.
При сортировке вложенных структур важно учитывать глубину объекта. Например, для поля user.address.city необходимо безопасно обращаться к нему через оператор опциональной цепочки или заранее проверять наличие свойств. Это исключает ошибки и делает код устойчивым к изменениям структуры данных.
Оптимальная стратегия – выносить функции сравнения в отдельные утилиты. Это повышает читаемость и позволяет переиспользовать логику сортировки для разных массивов с одинаковыми правилами.
Сортировка по числовому свойству объекта

При работе с массивом объектов важно учитывать, что метод sort() сравнивает элементы как строки, поэтому для корректной сортировки чисел необходимо использовать функцию сравнения.
Пример: сортировка массива товаров по цене:
const products = [
{ name: "Телефон", price: 1200 },
{ name: "Ноутбук", price: 2500 },
{ name: "Планшет", price: 900 }
];
products.sort((a, b) => a.price - b.price);
// [{name:"Планшет",price:900}, {name:"Телефон",price:1200}, {name:"Ноутбук",price:2500}]
Для убывающего порядка просто меняется местами вычитание: (b.price - a.price).
При необходимости сортировки по нескольким критериям в условии можно добавить вторичное сравнение, например по идентификатору:
items.sort((a, b) => a.price - b.price || a.id - b.id);
Использование такой конструкции позволяет избежать одинаковых значений на разных позициях и обеспечивает стабильность результатов.
Сортировка по строковому свойству с учетом регистра

При сравнении строк в JavaScript метод localeCompare() позволяет учитывать регистр символов. По умолчанию буквы верхнего регистра сортируются раньше строчных. Например, «Zebra» будет идти перед «apple».
Пример сортировки массива объектов по свойству name с учетом регистра:
const data = [
{ name: "banana" },
{ name: "Apple" },
{ name: "apple" },
{ name: "Zebra" }
];
data.sort((a, b) => a.name.localeCompare(b.name));
console.log(data);
Результат: [{name: "Apple"}, {name: "Zebra"}, {name: "apple"}, {name: "banana"}]. Это происходит из-за того, что при стандартных настройках localeCompare() прописные буквы имеют приоритет.
Чтобы явно контролировать чувствительность к регистру, используйте второй аргумент метода:
data.sort((a, b) => a.name.localeCompare(b.name, "ru", { sensitivity: "case" }));
Значение sensitivity: "case" оставляет различия между верхним и нижним регистром. Если требуется их игнорировать, используйте sensitivity: "base".
Рекомендация: всегда задавайте параметры localeCompare(), чтобы избежать неожиданных результатов при разных локалях и окружениях выполнения.
Сортировка по строковому свойству без учета регистра
При сравнении строковых значений свойств объектов важно игнорировать различия между заглавными и строчными буквами. Для этого можно применять метод localeCompare с опцией sensitivity: 'base', которая обеспечивает корректную сортировку без учета регистра.
Пример массива объектов:
const users = [
{ name: "Иван" },
{ name: "мария" },
{ name: "Анна" },
{ name: "сергей" }
];
Сортировка с использованием localeCompare:
users.sort((a, b) =>
a.name.localeCompare(b.name, 'ru', { sensitivity: 'base' })
);
Результат сортировки:
| Порядок | Имя |
|---|---|
| 1 | Анна |
| 2 | Иван |
| 3 | мария |
| 4 | сергей |
Использование localeCompare предпочтительно по сравнению с переводом строк в один регистр, так как учитывается локаль и правила сортировки конкретного языка.
Сортировка по дате, сохраненной в виде строки
Если даты в массиве объектов сохранены как строки, их нужно преобразовывать в объекты Date перед сравнением. Простое сравнение строк может давать некорректный результат: например, «12.01.2023» будет считаться меньше, чем «05.12.2022».
Рекомендуемый порядок действий:
- Определить формат строки (ISO, с разделителями точками, слэшами и т.д.).
- Преобразовать строку в объект
Dateили в числовое представление времени черезDate.parse()илиgetTime(). - Использовать метод
sort()с функцией сравнения.
Пример для формата YYYY-MM-DD:
const data = [
{ id: 1, date: "2023-01-12" },
{ id: 2, date: "2022-12-05" },
{ id: 3, date: "2023-05-20" }
];
data.sort((a, b) => new Date(a.date) - new Date(b.date));
Если формат нестандартный (например, DD.MM.YYYY), следует разбить строку и собрать корректный объект Date:
function parseDate(str) {
const [day, month, year] = str.split(".");
return new Date(year, month - 1, day);
}
data.sort((a, b) => parseDate(a.date) - parseDate(b.date));
Рекомендации:
- Использовать ISO-формат
YYYY-MM-DDдля хранения – он упрощает сортировку и совместим со строковым сравнением. - При работе с разными локалями избегать
Date.parse(), так как поведение может отличаться в зависимости от окружения. - Для больших массивов выгоднее один раз преобразовать даты в числа (таймстемпы), а затем сортировать.
Сортировка по нескольким свойствам объекта

Когда одного критерия недостаточно, используют последовательное сравнение нескольких свойств. Например, сначала сортируют пользователей по возрасту, а при равенстве – по имени.
Пример:
const users = [
{ name: "Иван", age: 25 },
{ name: "Анна", age: 25 },
{ name: "Петр", age: 30 },
{ name: "Ольга", age: 20 }
];
users.sort((a, b) => {
if (a.age !== b.age) {
return a.age - b.age; // сначала возраст
}
return a.name.localeCompare(b.name); // затем имя
});
В данном примере сначала формируется порядок по возрасту по возрастанию. Если возраст совпадает, используется localeCompare для корректной сортировки строк с учетом алфавита.
Для уменьшения дублирования кода можно использовать универсальную функцию сравнения:
function compareBy(...keys) {
return (a, b) => {
for (const key of keys) {
const res = typeof a[key] === "string"
? a[key].localeCompare(b[key])
: a[key] - b[key];
if (res !== 0) return res;
}
return 0;
};
}
users.sort(compareBy("age", "name"));
Такой подход позволяет задать список свойств в порядке приоритета и легко адаптировать сортировку под разные структуры данных.
Сортировка с использованием локали и collator
Для сортировки массива объектов с учетом языковых особенностей используется объект Intl.Collator. Он позволяет корректно сравнивать строки в соответствии с локалью и настройками чувствительности к регистру, диакритическим знакам и т.д.
Пример: сортировка массива пользователей по имени с учетом русской локали:
const collator = new Intl.Collator('ru', { sensitivity: 'base' });
users.sort((a, b) => collator.compare(a.name, b.name));
Параметр sensitivity принимает значения 'base', 'accent', 'case', 'variant'. Для русского языка 'base' игнорирует регистр и диакритические отличия, 'accent' учитывает ударения, 'case' – различие между заглавными и строчными буквами.
Для больших массивов рекомендуется создавать один экземпляр Intl.Collator и использовать его повторно, чтобы снизить нагрузку на сборку объектов при каждой сортировке.
С помощью numeric: true можно корректно сортировать строки с числами, например, «item2» будет идти перед «item10»:
const collator = new Intl.Collator('ru', { numeric: true });
items.sort((a, b) => collator.compare(a.label, b.label));
Использование Intl.Collator обеспечивает правильную локализованную сортировку без необходимости писать собственные функции сравнения для каждой локали и исключает ошибки при сортировке символов с диакритикой.
Сортировка с пользовательской функцией сравнения
В JavaScript метод Array.prototype.sort() принимает в качестве аргумента функцию сравнения, которая определяет порядок элементов. Функция получает два параметра, например a и b, и должна возвращать число: отрицательное, если a должно быть перед b, положительное – если a после b, ноль – если порядок не важен.
Для объектов функция сравнения обычно обращается к конкретным свойствам. Например, сортировка массива пользователей по возрасту:
const users = [
{ name: 'Аня', age: 25 },
{ name: 'Игорь', age: 30 },
{ name: 'Мария', age: 22 }
];
users.sort((a, b) => a.age - b.age);
Для строк с учетом регистра используют localeCompare:
const cities = [
{ name: 'Москва' },
{ name: 'сочи' },
{ name: 'Казань' }
];
cities.sort((a, b) => a.name.localeCompare(b.name, 'ru', { sensitivity: 'base' }));
Если необходимо комбинировать несколько критериев, возвращаемое значение можно строить по приоритету:
items.sort((a, b) => {
const diff = a.score - b.score;
return diff !== 0 ? diff : a.name.localeCompare(b.name);
});
Рекомендуется избегать вычислений внутри функции сравнения, которые могут вызвать побочные эффекты, и использовать кэширование значений для больших массивов. Это увеличивает производительность и гарантирует стабильную сортировку.
Вопрос-ответ:
Как в JavaScript отсортировать массив объектов по числовому свойству?
Для сортировки массива объектов по числовому свойству используется метод sort с функцией сравнения. Функция должна возвращать разность значений свойства двух объектов. Например, если есть массив users с полем age, можно написать users.sort((a, b) => a.age - b.age). Это расположит объекты по возрастанию возраста. Для обратного порядка достаточно поменять местами a и b в формуле: b.age - a.age.
Можно ли отсортировать массив объектов по строковому полю, учитывая регистр букв?
Да, для строковых полей стандартный метод sort использует сравнение Unicode, что чувствительно к регистру. Чтобы сортировка была независимой от регистра, можно привести строки к одному регистру внутри функции сравнения: arr.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase())). Метод localeCompare возвращает отрицательное, нулевое или положительное значение, что корректно упорядочивает строки в массиве.
Что происходит с исходным массивом при использовании метода sort?
Метод sort изменяет исходный массив напрямую, а не создает новый. Это значит, что после вызова arr.sort(...) порядок элементов в arr будет изменен. Если необходимо сохранить оригинальный порядок, сначала делают копию массива через slice() или оператор распространения [...arr], а затем сортируют копию.
Как сортировать массив объектов по нескольким критериям одновременно?
Для сортировки по нескольким свойствам внутри функции сравнения выполняют последовательные проверки. Например, если нужно сначала сортировать по фамилии, а затем по имени, можно написать: arr.sort((a, b) => a.lastName.localeCompare(b.lastName) || a.firstName.localeCompare(b.firstName)). Оператор || здесь позволяет перейти к следующему критерию, если предыдущие значения равны.
Можно ли использовать sort для массивов объектов с вложенными свойствами?
Да, можно обращаться к вложенным свойствам через точечную нотацию. Например, если объекты имеют структуру { profile: { score: 10 } }, то сортировка по score выполняется так: arr.sort((a, b) => a.profile.score - b.profile.score). Нужно учитывать, что если вложенные свойства могут отсутствовать, желательно добавить проверку, чтобы избежать ошибок при доступе к undefined.
Как отсортировать массив объектов по числовому полю в JavaScript?
В JavaScript для сортировки массива объектов по числовому значению можно использовать метод sort с функцией сравнения. Например, если у вас есть массив объектов с полем age, сортировка по возрастанию выглядит так: arr.sort((a, b) => a.age - b.age);. Здесь функция сравнения возвращает отрицательное число, если объект a должен идти перед b, положительное — если наоборот, и 0, если порядок не меняется. Для сортировки по убыванию достаточно поменять местами a и b: arr.sort((a, b) => b.age - a.age);. Такой способ работает только для чисел. Для строк следует использовать localeCompare, чтобы учитывать язык и регистр: arr.sort((a, b) => a.name.localeCompare(b.name));.
