Есть ли способ сортировки/заказа ключей в JavaScript-объектах?
Например, следующий
var data = {
'States': ['NSW', 'VIC'],
'Countries': ['GBR', 'AUS'],
'Capitals': ['SYD', 'MEL']
}
for (var item in data) {
console.log(item);
}
печатает
States
Countries
Capitals
Есть ли способ сортировки по алфавиту, чтобы он печатал
Capitals
Countries
States
Ответы
Ответ 1
Не внутри самого объекта: набор свойств объекта неупорядочен.
Одна вещь, которую вы можете сделать, это использовать Object.keys()
и отсортировать массив, а затем выполнить итерацию.
Object.keys(data)
.sort()
.forEach(function(v, i) {
console.log(v, data[v]);
});
Патчи (реализации) для браузеров, которые не поддерживают ECMAScript 5th edition:
Ответ 2
Да, есть. Не в стандарте ECMAScript, но поддерживается в браузерах и Node.js и, по-видимому, стабильный. См. fooobar.com/questions/3724/....
EDIT. Это возвращает объект, в котором заказываются ключи. Вы можете использовать Object.keys(...)
, чтобы получить упорядоченные ключи от объекта.
Зачем беспокоиться об упорядочивании объектов? Разница может иметь значение в некоторых приложениях, таких как синтаксический анализ XML с помощью xml2js, который представляет XML как вложенные объекты и использует XML-теги в качестве хеш-ключей,
Есть несколько примечаний:
-
Клавиши
- которые выглядят как целые числа, отображаются сначала и в числовом порядке.
Клавиши
- которые выглядят как строки, отображаются следующим образом и в порядке вставки.
- этот порядок сообщается
Object.keys(obj)
- порядок, о котором сообщает
for (var key in obj) {...}
, может отличаться в Safari, Firefox
Функция возвращает объект со отсортированными клавишами, вставленными в алфавитном порядке:
function orderKeys(obj, expected) {
var keys = Object.keys(obj).sort(function keyOrder(k1, k2) {
if (k1 < k2) return -1;
else if (k1 > k2) return +1;
else return 0;
});
var i, after = {};
for (i = 0; i < keys.length; i++) {
after[keys[i]] = obj[keys[i]];
delete obj[keys[i]];
}
for (i = 0; i < keys.length; i++) {
obj[keys[i]] = after[keys[i]];
}
return obj;
}
Вот быстрый тест:
var example = {
"3": "charlie",
"p:style": "c",
"berries": "e",
"p:nvSpPr": "a",
"p:txBody": "d",
"apples": "e",
"5": "eagle",
"p:spPr": "b"
}
var obj = orderKeys(example);
это возвращает
{ '3': 'charlie',
'5': 'eagle',
apples: 'e',
berries: 'e',
'p:nvSpPr': 'a',
'p:spPr': 'b',
'p:style': 'c',
'p:txBody': 'd' }
Затем вы можете получить упорядоченные ключи как:
Object.keys(obj)
Что возвращает
["3", "5", "apples", "berries", "p:nvSpPr", "p:spPr", "p:style", "p:txBody"]
Ответ 3
Если преобразование в массив не подходит вашему шаблону, и вы знаете ключи своего объекта, вы также можете сделать что-то вроде этого:
В вашем контроллере определите массив с ключами в правильном порядке:
this.displayOrder = [
'firstKey',
'secondKey',
'thirdKey'
];
В своем шаблоне повторите клавиши вашего displayOrder, а затем используйте ng-init, чтобы ссылаться на ваш объект.
<div ng-repeat="key in ctrl.displayOrder" ng-init="entry = ctrl.object[key]">
{{ entry.detail }}
</div>