Мне нужно отсортировать объекты JavaScript по ключу.
Отсюда следующее:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Станет:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
источник
источник
Object.entries
иObject.fromEntries
были добавлены в JS, это может быть достигнуто с очень коротким однострочником:Object.fromEntries(Object.entries(obj).sort())
Ответы:
Другие ответы на этот вопрос устарели, никогда не соответствовали реальности реализации и официально стали неверными после публикации спецификации ES6 / ES2015.
См. Раздел, посвященный порядку итераций свойств в « Изучении ES6 » Акселя Раушмайера :
Так что да, объекты JavaScript являются на самом деле упорядочены, и порядок их ключей / свойства могут быть изменены.
Вот как вы можете отсортировать объект по ключам / свойствам в алфавитном порядке:
Используйте
var
вместоconst
совместимости с двигателями ES5.источник
JavaScript объекты 1 не упорядочены. Бессмысленно пытаться «сортировать» их. Если вы хотите перебрать свойства объекта, вы можете отсортировать ключи и затем извлечь связанные значения:
Альтернативная реализация с использованием
Object.keys
фантазии:1 Не быть педантичным, но нет такого понятия, как объект JSON .
источник
{"a", 1}
как JSON Array - точный термин для такой строки[1]
. Полезно иметь возможность общаться, произнося такие вещи, как третий объект в моем массиве, когда у вас есть строка[{x: 1}, {y: 2}, {z: 3}]
, поэтому я очень предпочитаю «Это не объект JSON» при комментировании литерала Javascript, а не «Нет такого «вещь как объект JSON», что в дальнейшем вызовет больше путаницы и затруднений в общении, когда OP на самом деле работает с JSON.{"a", 1}
является либо литералом объекта, либо текстом JSON (или, если хотите, строкой JSON). Что это зависит от контекста, первый, если он появляется дословно в исходном коде JavaScript, второй, если это строка, которую нужно передать в анализатор JSON для дальнейшего использования. Существуют реальные различия между ними, когда речь идет о разрешенном синтаксисе, правильном использовании и сериализации.Многие люди упоминают, что «объекты не могут быть отсортированы» , но после этого они дают вам решение, которое работает. Парадокс, не правда ли?
Никто не упоминает, почему эти решения работают. Они есть, потому что в большинстве реализаций браузера значения в объектах хранятся в том порядке, в котором они были добавлены. Поэтому, если вы создаете новый объект из отсортированного списка ключей, он возвращает ожидаемый результат.
И я думаю, что мы могли бы добавить еще одно решение - функциональный путь ES5:
ES2015 версия выше (отформатированная в «однострочник»):
Краткое объяснение приведенных выше примеров (как указано в комментариях):
Object.keys
дает нам список ключей в предоставленном объекте (obj
илиo
), затем мы сортируем те, используя алгоритм сортировки по умолчанию, затем.reduce
используется для преобразования этого массива обратно в объект, но на этот раз со всеми отсортированными ключами.источник
for...in
).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Ребята, я образно шокирован! Конечно, все ответы несколько устарели, но никто даже не упомянул стабильность в сортировке! Так что терпите меня, я сделаю все возможное, чтобы ответить на сам вопрос и вдаваться в подробности здесь. Поэтому я собираюсь извиниться, сейчас будет много читать.
Поскольку это 2018 год, я буду использовать только ES6, все полифилы доступны в документах MDN, которые я приведу в данной части.
Ответ на вопрос:
Если ваши ключи являются только числами, то вы можете безопасно использовать их
Object.keys()
вместе сArray.prototype.reduce()
для возврата отсортированного объекта:Однако, если вы работаете со строками, я настоятельно рекомендую объединить
Array.prototype.sort()
все это в цепочку :Если кому-то интересно, что делает сокращение:
Если необходимо, вот объяснение для одного лайнера:
Почему сортировка немного сложна:
Короче
Object.keys()
, вернет массив с тем же порядком, что и обычный цикл:Sidenote - вы также можете использовать
Object.keys()
массивы, помните, что индекс будет возвращен:Но это не так просто, как показано в этих примерах, объекты реального мира могут содержать цифры и буквы алфавита или даже символы (пожалуйста, не делайте этого).
Вот пример со всеми из них в одном объекте:
Теперь, если мы используем
Array.prototype.sort()
вышеупомянутый массив, изменения получатся:Вот цитата из документов:
Вы должны убедиться, что один из них возвращает желаемый результат для вас. В реальных примерах люди склонны смешивать вещи, особенно если вы используете разные информационные входы, такие как API и базы данных вместе.
Так в чем же дело?
Ну, есть две статьи, которые должен понять каждый программист:
Алгоритм на месте :
Так что в основном наш старый массив будет перезаписан! Это важно, если вы хотите сохранить старый массив по другим причинам. Так что имейте это в виду.
Алгоритм сортировки
Это показывает, что сортировка верна, но она изменилась. Таким образом, в реальном мире, даже если сортировка правильная, мы должны убедиться, что получаем то, что ожидаем! Это очень важно, имейте это в виду. Дополнительные примеры JavaScript можно найти в Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
источник
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
или{5: 'spades'}
вы начинаете сортировать массив, она станет потенциально нестабильной в таких играх, как рамми. Не говорить на разных языках.Это работает для меня
источник
Это 2019 год, и у нас есть 2019 способ решить эту проблему :)
источник
вот 1 лайнер
источник
(o[k] = v, o)
, Почему это даже работает, где я могу найти документы об этом? Очевидно, он возвращает самый правый параметр, но почему?o[k]
равняется,v
а затем возвращаетсяo
Это старый вопрос, но, следуя ответу Матиаса Биненса, я сделал короткую версию для сортировки текущего объекта без особых накладных расходов.
после выполнения кода для самого «неупорядоченного» объекта ключи будут отсортированы в алфавитном порядке.
источник
Используя lodash это будет работать:
Просто пища для размышлений.
источник
Предположим, что это может быть полезно в отладчике VisualStudio, который показывает неупорядоченные свойства объекта.
источник
Подчеркнуть версию :
Если вы не доверяете своему браузеру в сохранении порядка ключей, я настоятельно рекомендую полагаться на упорядоченный массив парных массивов ключ-значение.
источник
_.object(_.sortBy(_.pairs(unordered), _.first))
источник
Может быть, немного более элегантная форма:
PS и то же самое с синтаксисом ES6 +:
источник
рекурсивная сортировка для вложенных объектов и массивов
источник
else
там - может быть верно как для, такArray.isArray(obj[key])
и дляtypeof obj[key] === 'object'
function sortObjectKeys(obj){
::if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Для устойчивости я при полном запуске также добавил:if(obj == null || obj == undefined){ return obj; }
Как уже упоминалось, объекты неупорядочены.
Однако...
Вы можете найти эту идиому полезной:
Затем вы можете перебирать kv и делать все, что пожелаете.
источник
Вот чистая версия на основе lodash, которая работает с вложенными объектами
Было бы еще чище, если бы у Лодаша был
toObject()
метод ...источник
Просто используйте lodash, чтобы разархивировать map и sortBy первое значение пары, и снова заархивировать, чтобы вернуть отсортированный ключ.
Если вы хотите отсортировать значение, измените индекс пары на 1 вместо 0
источник
Сортирует ключи рекурсивно, сохраняя ссылки.
Пример:
источник
delete o[e[0]];
там? Мы не можем просто назначить?источник
Это облегченное решение для всего, что мне нужно для сортировки JSON.
источник
Используйте этот код, если у вас есть вложенные объекты или если у вас есть вложенный массив obj.
источник
Решение:
Объяснение:
Многие среды выполнения JavaScript хранят значения внутри объекта в порядке их добавления.
Чтобы отсортировать свойства объекта по его ключам, вы можете использовать функцию Object.keys, которая будет возвращать массив ключей. Массив ключей затем можно отсортировать с помощью метода Array.prototype.sort (), который сортирует элементы массива на месте (нет необходимости присваивать их новой переменной).
Как только ключи отсортированы, вы можете начать использовать их один за другим, чтобы получить доступ к содержимому старого объекта, чтобы заполнить новый объект (который теперь отсортирован).
Ниже приведен пример процедуры (вы можете проверить ее в целевых браузерах):
Примечание. Object.keys - это метод ECMAScript 5.1, но для старых браузеров используется полифил:
источник
Я передал некоторые перечисления Java в объекты JavaScript.
Эти объекты вернули мне правильные массивы. если ключи объекта имеют смешанный тип (string, int, char), возникает проблема.
Показать фрагмент кода
источник
Простой и читаемый фрагмент кода с использованием lodash.
Ключ нужно заключать в кавычки только при вызове sortBy. Это не должно быть в кавычках в самих данных.
Кроме того, ваш второй параметр для отображения неверен. Это должна быть функция, но проще использовать pluck.
источник
Есть замечательный проект @sindresorhus, называемый sort-keys, который работает потрясающе.
Вы можете проверить его исходный код здесь:
https://github.com/sindresorhus/sort-keys
Или вы можете использовать его с npm:
Вот также примеры кода из его readme
источник
Чистый ответ JavaScript для сортировки объекта. Это единственный ответ, который я знаю, который будет обрабатывать отрицательные числа. Эта функция предназначена для сортировки числовых объектов.
Введите obj = {1000: {}, -1200: {}, 10000: {}, 200: {}};
Выходными данными будет объект, отсортированный по этим числам с новыми ключами, начинающимися с 0.
источник
Просто чтобы упростить это и сделать его более ясным ответ от Мэтта Болла
источник
Не уверен, что это отвечает на вопрос, но это то, что мне было нужно.
Называется как:
источник
Одна строка:
источник
лучший способ сделать это
Вы можете сначала преобразовать ваш почти подобный массиву объект в реальный массив, а затем использовать .reverse ():
Пустой слот в конце, если причина, потому что ваш первый индекс равен 1 вместо 0. Вы можете удалить пустой слот с помощью .length- или .pop ().
В качестве альтернативы, если вы хотите заимствовать .reverse и вызвать его для того же объекта, это должен быть объект, похожий на массив. То есть ему нужно свойство длины:
Обратите внимание, что он вернет тот же объект, полностью похожий на массив, поэтому он не будет настоящим массивом. Затем вы можете использовать delete для удаления свойства длины.
источник