Сортировка объекта JavaScript по ключам: сохраняем значения
Быстрый ответ
const obj = { c: 3, a: 1, b: 2 };
// Извлекаем пары ключ-значение при помощи Object.entries, сортируем их, а затем снова собираем в объект с помощью Object.fromEntries
const sorted = Object.fromEntries(Object.entries(obj).sort());
console.log(sorted); // { a: 1, b: 2, c: 3 } — всё расположено в алфавитном порядке 🧐
Отношения ключ-значение при сортировке
Для того чтобы отсортировать объект, сохраняя при этом связь ключ-значение и соблюдая алфавитный порядок ключей, мы можем воспользоваться методами Object.keys()
, sort()
и reduce()
:
const obj = { lemur: 3, antelope: 1, zebra: 2 };
// Сортируем животных по их названиям
const sortedObj = Object.keys(obj)
.sort()
.reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
console.log(sortedObj); // { antelope: 1, lemur: 3, zebra: 2 }
Изучаем тонкости упорядочивания ключей
Начиная с версии ES2015, мы знаем, в каком порядке будут учтены ключи при итерациях:
- Сначала идут целочисленные ключи, как если бы это были индексы массива.
- Затем следуют строковые ключи в порядке их добавления.
- В конце учтены символы, также в очередности их создания.
Однако старые реализации JavaScript могут не соблюдать данный порядок итераций.
Проблема с числовыми ключами
Числовые ключи могут восприниматься как индексы массива, вследствие чего они сортируются перед строковыми и символьными ключами:
const numericObj = { 10: 'val10', 2: 'val2', 1: 'val1' };
// Числа расставляются в нужном порядке
const sortedNumericObj = Object.keys(numericObj)
.sort((a, b) => a – b)
.reduce((acc, key) => {
acc[key] = numericObj[key];
return acc;
}, {});
console.log(sortedNumericObj); // { 1: 'val1', 2: 'val2', 10: 'val10' }
На сортировку числовых ключей мы можем повлиять с помощью .sort()
.
Случаи, с которыми стоит быть готовым столкнуться
При использовании sort()
могут возникнуть следующие непредвиденные ситуации:
- Смешанные символы-ключи могут ввести в заблуждение, так как они комбинируют в себе и цифры, и буквы.
- Символьные ключи сложно обнаружить при помощи методов
Object.keys()
иObject.entries()
.
Избегание проблем с обратной совместимостью при использовании var
В устаревшем коде, где еще не применяется ES6, можно использовать var
для обеспечения совместимости переменных:
var nonES6Sorted = Object.keys(obj).sort().reduce(function (acc, key) {
acc[key] = obj[key];
return acc;
}, {});
Оценка точности результатов (проверка правильности значения)
Важно всегда удостоверяться в корректности полученных результатов сортировки, настраивая методы сравнения в соответствии с поставленными задачами.
Возможность учёта значений объектов во время сортировки
Может понадобиться учитывать не только ключи, но и значения в процессе сортировки:
// Сортировка с учетом значений
const sortByValue = Object.entries(obj)
.sort((a, b) => a[1] – b[1])
.reduce((acc, [key, value]) => {
acc[key] = value;
return acc;
}, {});
Сортировка на месте в угоду сохранения оригинального порядка
Сортировка "на месте" может оказаться не лучшим выбором, если сохранение первоначального порядка ключей имеет значение для ваших задач.
Визуализация отсортированных объектов
Представьте себе библиотеку, где книги расставлены случайным образом:
До: 📘📗📙📕📚
// Пора привести в порядок книги на полках
const sortedShelf = Object.keys(unsortedShelf)
.sort()
.reduce((obj, key) => {
obj[key] = unsortedShelf[key];
return obj;
}, {});
После: 📕📗📘📙📚
Так же, как каждая книга нашла свое место на полке, мы поставили ключи в объекте в нужный порядок.
Продвинутые метоы для уверенного проведения операции sort()
Стабильная сортировка и пользовательские функции сравнения помогут преодолеть сложности сортировки:
Стабильная сортировка начиная с ES2019 помогает сохранить порядок элементов.
Пользовательские функции сравнения позволяют реализовать индивидуальные подходы к сортировке:
// Учитываем размер символов при сортировке
const caseInsensitiveSort = Object.keys(obj)
.sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
.reduce((acc, key) => {
acc[key] = obj[key];
return acc;
}, {});
Устранение проблем и решение типичных ошибок
Если вдруг возникли проблемы, то важно взглянуть на структуру объекта, тип данных ключей, и поддержку используемых методов в вашей среде.
Полезные материалы
- Object.keys() – JavaScript | MDN — Ваш путеводитель по методу
Object.keys()
. - Array.prototype.sort() – JavaScript | MDN — Компас для сортировки массивов.
- Sort JavaScript object by key – Stack Overflow — Хранилище полезных советов и решений.
- Object.entries() – JavaScript | MDN — Руководящая нить по методу
Object.entries()
. - Object.keys, values, entries — Практическое руководство по
Object.keys()
,values()
иentries()
. - An Introduction to JSON | DigitalOcean — Стартовый курс по основам JSON (JavaScript Object Notation).
- Data Structures: Objects and Arrays :: Eloquent JavaScript — Глубокое погружение в тему объектов и массивов от Eloquent JavaScript.