Как отсортировать объектный литерал JS?
Если у меня есть этот литерал объекта JS:
var foo = {
Sussy: 4,
Billy: 5,
Jimmy: 2,
Sally: 1
};
Как я могу создать новый отсортированный литерал объекта:
var bar = {
Sally: 1,
Jimmy: 2,
Sussy: 4,
Billy: 5
};
2 ответа
Re: Как отсортировать объект JS?
Ответ: вы не можете. Таким образом, вместо этого вам нужна более сложная структура данных. У вас есть много вариантов:
- Вы можете использовать отдельный массив для хранения порядка ключей объекта. (Это то, что демонстрирует ответ @Felix Kling.) Хорошо: быстрый поиск по порядку или имени. Плохо: нужна вторая структура данных, которая должна синхронизироваться с первой.
- Вместо Объекта, просто содержащего свойства и значения, свойства могут содержать Объекты, которые содержат значения и порядок сортировки. Хорошо: 1 структура данных. Быстрый поиск по имени свойства. Плохо: медленный поиск по порядку (нужно сканировать структуру). Медленная сортировка.
- Используйте массив с элементами, состоящими из объектов, которые содержат ключ и значение. Хорошо: 1 структура данных. Быстрый поиск по заказу. Быстрая сортировка. Плохо: медленный поиск по имени свойства (необходимо просканировать структуру).
Я рекомендую решение 3, так как оно использует механику JS для управления заказами.
Примеры:
// Object holds sort order: (Solution 2)
var foo = {
Suzy: {v: 4, order: 0},
Billy: {v: 5, order: 1},
Jimmy: {v: 2, order: 2},
Sally: {v: 1, order: 3}
};
// Array holds keys: (Solution 3)
var woof = [
{k: 'Suzy', v: 4},
{k: 'Billy', v: 5},
{k: 'Jimmy', v: 2},
{k: 'Sally', v: 1}
];
// Sort the woof array by the key names:
woof.sort(function(a, b) {
return a.k.localeCompare(b.k);
});
// The third key and value:
woof[2].k; // the third key
woof[2].v; // the third value
Отредактировано: обновлен код для исправления опечатки. Спасибо, Мартин Фидо
Свойства объекта не имеют определенного порядка (порядок зависит от реализации), и вы не можете сортировать свойства.
Вы должны сохранить массив ключей и соответственно отсортировать их, например:
var keys = [];
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
keys.push(key);
}
}
keys.sort(function(a, b) {
return obj[a] - obj[b];
});
Теперь вы можете перебирать значения массива и использовать их для доступа к соответствующему свойству объекта.
Оказывается, с ES2015 порядок свойств объекта предсказуем. Что потрясающе.