Сортировка свойств объекта по значениям
У меня есть объект 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
Преобразование объекта JS в строку JSON
Сортировка массива объектов по одному свойству