ПРИХОДИТЕ УЧИТЬСЯ НОВОЙ ПРОФЕССИИ ЛЕТОМ СО СКИДКОЙ ДО 70%Забронировать скидку

Сортировка объекта JavaScript по ключам: сохраняем значения

Пройдите тест, узнайте какой профессии подходите и получите бесплатную карьерную консультацию
В конце подарим скидку до 55% на обучение
Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

JS
Скопировать код
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 } — всё расположено в алфавитном порядке 🧐
Пройдите тест и узнайте подходит ли вам сфера IT
Пройти тест

Отношения ключ-значение при сортировке

Для того чтобы отсортировать объект, сохраняя при этом связь ключ-значение и соблюдая алфавитный порядок ключей, мы можем воспользоваться методами Object.keys(), sort() и reduce():

JS
Скопировать код
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, мы знаем, в каком порядке будут учтены ключи при итерациях:

  1. Сначала идут целочисленные ключи, как если бы это были индексы массива.
  2. Затем следуют строковые ключи в порядке их добавления.
  3. В конце учтены символы, также в очередности их создания.

Однако старые реализации JavaScript могут не соблюдать данный порядок итераций.

Проблема с числовыми ключами

Числовые ключи могут восприниматься как индексы массива, вследствие чего они сортируются перед строковыми и символьными ключами:

JS
Скопировать код
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 для обеспечения совместимости переменных:

JS
Скопировать код
var nonES6Sorted = Object.keys(obj).sort().reduce(function (acc, key) {
  acc[key] = obj[key];
  return acc;
}, {});

Оценка точности результатов (проверка правильности значения)

Важно всегда удостоверяться в корректности полученных результатов сортировки, настраивая методы сравнения в соответствии с поставленными задачами.

Возможность учёта значений объектов во время сортировки

Может понадобиться учитывать не только ключи, но и значения в процессе сортировки:

JS
Скопировать код
// Сортировка с учетом значений
const sortByValue = Object.entries(obj)
  .sort((a, b) => a[1] – b[1])
  .reduce((acc, [key, value]) => {
    acc[key] = value;
    return acc;
  }, {});

Сортировка на месте в угоду сохранения оригинального порядка

Сортировка "на месте" может оказаться не лучшим выбором, если сохранение первоначального порядка ключей имеет значение для ваших задач.

Визуализация отсортированных объектов

Представьте себе библиотеку, где книги расставлены случайным образом:

До: 📘📗📙📕📚

JS
Скопировать код
// Пора привести в порядок книги на полках
const sortedShelf = Object.keys(unsortedShelf)
    .sort()
    .reduce((obj, key) => { 
        obj[key] = unsortedShelf[key]; 
        return obj;
    }, {});

После: 📕📗📘📙📚

Так же, как каждая книга нашла свое место на полке, мы поставили ключи в объекте в нужный порядок.

Продвинутые метоы для уверенного проведения операции sort()

Стабильная сортировка и пользовательские функции сравнения помогут преодолеть сложности сортировки:

  • Стабильная сортировка начиная с ES2019 помогает сохранить порядок элементов.

  • Пользовательские функции сравнения позволяют реализовать индивидуальные подходы к сортировке:

JS
Скопировать код
// Учитываем размер символов при сортировке
const caseInsensitiveSort = Object.keys(obj)
  .sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()))
  .reduce((acc, key) => {
    acc[key] = obj[key];
    return acc;
  }, {});

Устранение проблем и решение типичных ошибок

Если вдруг возникли проблемы, то важно взглянуть на структуру объекта, тип данных ключей, и поддержку используемых методов в вашей среде.

Полезные материалы

  1. Object.keys() – JavaScript | MDN — Ваш путеводитель по методу Object.keys().
  2. Array.prototype.sort() – JavaScript | MDN — Компас для сортировки массивов.
  3. Sort JavaScript object by key – Stack Overflow — Хранилище полезных советов и решений.
  4. Object.entries() – JavaScript | MDN — Руководящая нить по методу Object.entries().
  5. Object.keys, values, entries — Практическое руководство по Object.keys(), values() и entries().
  6. An Introduction to JSON | DigitalOcean — Стартовый курс по основам JSON (JavaScript Object Notation).
  7. Data Structures: Objects and Arrays :: Eloquent JavaScript — Глубокое погружение в тему объектов и массивов от Eloquent JavaScript.