Сортировка свойств объекта по значениям
У меня есть объект JavaScript следующего вида:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
Есть ли способ отсортировать свойства этого объекта по значению? В итоге я хотел бы получить объект в следующем виде:
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
Как это можно реализовать?
5 ответ(ов)
Вы можете отсортировать ключи объекта по значениям, не дублируя всю структуру данных и не используя массив, когда требуется ассоциативный массив. Вот альтернативный способ сделать то же самое, что и в примере bonna:
var list = {"you": 100, "me": 75, "foo": 116, "bar": 15};
var keysSorted = Object.keys(list).sort(function(a, b) {
return list[a] - list[b];
});
console.log(keysSorted); // bar, me, you, foo
В этом коде мы сначала получаем массив ключей с помощью Object.keys()
, а затем сортируем его методом sort()
, используя функцию сравнения, которая основана на значениях ассоциативного массива list
. Это позволяет нам получить отсортированные ключи без создания дополнительной копии всей структуры данных.
Ваши объекты могут иметь любое количество свойств, и вы можете сортировать их по любому свойству объекта, будь это число или строка, если поместите объекты в массив. Рассмотрим следующий массив:
var arrayOfObjects = [
{
name: 'Дина',
born: 1373925600000, // Пн, 15 июля 2013
num: 4,
sex: 'женский'
},
{
name: 'Бейонсе',
born: 1366832953000, // Ср, 24 апреля 2013
num: 2,
sex: 'женский'
},
{
name: 'Альберт',
born: 1370288700000, // Пн, 3 июня 2013
num: 3,
sex: 'мужской'
},
{
name: 'Дорис',
born: 1354412087000, // Сб, 1 декабря 2012
num: 1,
sex: 'женский'
}
];
Чтобы отсортировать по дате рождения, от самого старшего к самому младшему, вы можете использовать следующий код:
// используем slice(), чтобы скопировать массив, а не просто создать ссылку
var byDate = arrayOfObjects.slice(0);
byDate.sort(function(a, b) {
return a.born - b.born;
});
console.log('по дате:');
console.log(byDate);
Для сортировки по имени используйте следующий код:
var byName = arrayOfObjects.slice(0);
byName.sort(function(a, b) {
var x = a.name.toLowerCase();
var y = b.name.toLowerCase();
return x < y ? -1 : x > y ? 1 : 0;
});
console.log('по имени:');
console.log(byName);
Дополнительный пример можно найти по следующей ссылке: http://jsfiddle.net/xsM5s/16/
В JavaScript объекты по своей сути неупорядочены (см. Спецификацию языка ECMAScript, раздел 8.6). Спецификация языка даже не гарантирует, что если вы дважды последовательно переберёте свойства объекта, они будут возвращены в том же порядке во второй раз.
Если вам необходим порядок, используйте массив и метод Array.prototype.sort.
В вашем коде реализована функция sortAssocObject
, которая сортирует ассоциативный массив (объект) по значениям и возвращает новый объект с отсортированными парами ключ-значение. Давайте разберём шаги более подробно.
Создание массива пар ключ-значение: Вы инициализируете пустой массив
sortable
и заполняете его парами[ключ, значение]
из исходного объектаlist
с помощью циклаfor...in
.for (var key in list) { sortable.push([key, list[key]]); }
После этого
sortable
будет выглядеть так:[["you", 100], ["me", 75], ["foo", 116], ["bar", 15]]
.Сортировка: Затем вы сортируете массив
sortable
по значению (второму элементу подмассива) с использованием методаsort()
. Заданная функция сравнения сортирует массив по возрастанию:sortable.sort(function(a, b) { return (a[1] < b[1] ? -1 : (a[1] > b[1] ? 1 : 0)); });
В результате массив будет отсортирован по значениям, и теперь он будет выглядеть так:
[["bar", 15], ["me", 75], ["you", 100], ["foo", 116]]
.Создание нового объекта: Далее вы создаёте новый объект
orderedList
, в который добавляете отсортированные пары ключ-значение изsortable
:var orderedList = {}; for (var idx in sortable) { orderedList[sortable[idx][0]] = sortable[idx][1]; }
Возврат отсортированного объекта: Наконец, вы возвращаете новый объект
orderedList
, который будет содержать те же ключи, но в соответствии с отсортированными значениями:return orderedList;
После вызова функции sortAssocObject(list)
результатом будет объект {bar: 15, me: 75, you: 100, foo: 116}
, где ключи расположены в порядке возрастания значений.
Если вам нужно отсортировать объект по значениям в порядке убывания, вы можете изменить условие в функции сравнения сортировки на следующее:
sortable.sort(function(a, b) {
return (a[1] > b[1] ? -1 : (a[1] < b[1] ? 1 : 0));
});
Таким образом, вы получите объект, отсортированный по убыванию значений.
Если вам нужно отсортировать объект по его значениям без использования нескольких циклов for
, вы можете использовать метод Object.entries()
для преобразования объекта в массив пар ключ-значение, затем отсортировать этот массив и, наконец, преобразовать его обратно в объект с помощью Object.fromEntries()
. Вот пример кода:
const list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
let sorted = Object.fromEntries(
Object.entries(list).sort((a, b) => a[1] - b[1])
);
console.log('Отсортированный объект: ', sorted);
В этом примере Object.entries(list)
создает массив массивов, где каждый внутренний массив содержит ключ и значение. Затем мы используем метод sort()
для сортировки этого массива по значениям (второй элемент каждого внутреннего массива). Вызов Object.fromEntries()
преобразует отсортированный массив обратно в объект.
Если вам нужно сортировать по ключам, просто измените индексы в функции sort()
на 0
:
let sortedByKey = Object.fromEntries(
Object.entries(list).sort((a, b) => a[0].localeCompare(b[0]))
);
console.log('Отсортированный объект по ключам: ', sortedByKey);
Таким образом, вы сможете сортировать объект по его значениям или ключам без необходимости использования нескольких циклов for
.
Как удалить свойство из объекта JavaScript?
Доступ к свойству объекта с динамически вычисляемым именем
Проверка существования вложенного ключа объекта JavaScript
Как удалить все дубликаты из массива объектов?
Почему null является объектом и в чем разница между null и undefined?