Подтвердить что ты не робот

Есть ли способ сортировки/заказа ключей в 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
4b9b3361

Ответ 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>