Сортировка объекта JavaScript по ключу
Я столкнулся с проблемой сортировки объектов в JavaScript по ключам. У меня есть объект, который выглядит следующим образом:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Мне нужно отсортировать его так, чтобы он выглядел следующим образом:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
Подскажите, как я могу реализовать эту сортировку? Спасибо!
5 ответ(ов)
Многие люди упоминают, что «объекты нельзя сортировать», но после этого они предлагают решения, которые работают. Парадокс, не правда ли?
Никто не объясняет, почему эти решения работают. На самом деле, они работают, потому что в большинстве реализаций браузеров значения в объектах хранятся в порядке их добавления. Поэтому, если вы создаете новый объект из отсортированного списка ключей, вы получаете ожидаемый результат.
Думаю, мы можем добавить еще одно решение – функциональный способ ES5:
function sortObject(obj) {
return Object.keys(obj).sort().reduce(function (result, key) {
result[key] = obj[key];
return result;
}, {});
}
Версия для ES2015 (отформатированная в «однострочник»):
const sortObject = o => Object.keys(o).sort().reduce((r, k) => (r[k] = o[k], r), {});
Краткое объяснение приведенных примеров (как спрашивали в комментариях):
Object.keys
дает нам список ключей в переданном объекте (obj
или o
), затем мы сортируем эти ключи, используя стандартный алгоритм сортировки, а затем .reduce
используется для преобразования этого массива обратно в объект, но на этот раз с отсортированными ключами.
В 2019 году у нас есть современный способ решения этой задачи 😃
Вы можете использовать комбинацию Object.entries
, sort
и Object.fromEntries
, чтобы отсортировать объект по ключам. Вот пример:
const sortedObject = Object.fromEntries(
Object.entries({b: 3, a: 8, c: 1}).sort()
);
В результате sortedObject
будет выглядеть так: { a: 8, b: 3, c: 1 }
. Этот подход позволяет удобно преобразовать объект в массив пар [ключ, значение], отсортировать его, а затем преобразовать обратно в объект.
Ваша строка кода представляет собой способ сортировки объектов по ключам и возвращения нового объекта. Давайте разберем, как это работает:
Object.entries(data)
— эта функция преобразует объектdata
в массив пар ключ-значение..sort()
— сортирует массив пар по ключам..reduce(...)
— с помощью методаreduce
мы собираем отсортированные пары обратно в объект.
Функция reduce
принимает аккумулятор o
и текущую пару [k, v]
, добавляет текущее значение v
по ключу k
в объект o
и возвращает o
на следующей итерации.
Таким образом, данный код создает новый объект, отсортированный по ключам исходного объекта data
.
Вот ваш код с комментариями:
var data = { zIndex: 99,
name: 'sravan',
age: 25,
position: 'architect',
amount: '100k',
manager: 'mammu' };
// Сортируем объект по ключам и выводим новый отсортированный объект
console.log(Object.entries(data).sort().reduce((o, [k, v]) => (o[k] = v, o), {}));
Этот подход эффективен и предоставляет элегантное решение для получения отсортированного объекта в JavaScript при использовании ES6.
Это работает для меня:
/**
* Возвращает объект, отсортированный по его ключам
*/
var sortObjectByKey = function(obj) {
var keys = [];
var sorted_obj = {};
for (var key in obj) {
if (obj.hasOwnProperty(key)) {
keys.push(key);
}
}
// сортируем ключи
keys.sort();
// создаем новый объект на основе отсортированных ключей
jQuery.each(keys, function(i, key) {
sorted_obj[key] = obj[key];
});
return sorted_obj;
};
Этот код создает новый объект, отсортированный по ключам исходного объекта. Сначала мы собираем все ключи, затем сортируем их и создаем новый объект на основе отсортированных ключей.
Это старый вопрос, но опираясь на ответ Маттиаса Биненса, я подготовил короткий вариант для сортировки текущего объекта без особых затрат.
Object.keys(unordered).sort().forEach(function(key) {
var value = unordered[key];
delete unordered[key];
unordered[key] = value;
});
После выполнения этого кода объект "unordered" будет иметь свои ключи отсортированными в алфавитном порядке.
Сортировка массива объектов по значению строкового свойства
Сортировка массива объектов по значениям свойств
Как отсортировать массив целых чисел?
Сортировка свойств объекта по значениям
Как перенаправить на другую веб-страницу?