2012-03-14 6 views
0

У меня есть следующие данные JSON, возвращаемые, но по какой-то причине Javascript или jQuery ajax, похоже, реорганизуют список элементов. Сервер возвращает данные, отсортированные в алфавитном порядке по item.title (проверено) ...Упорядочение объекта JSON подделкой jQuery или Javascript

JSON ниже после того, как заказ был разделывали:

{ 
     "count": 3, 
     "items": { 
      "tardis": { 
       "type": 40, 
       "title": "Tardis", 
       "timeMachine": true, 
       "reliable": true 
      }, 
      "stargate": { 
       "type": "Milky way gate", 
       "title": "Stargate + solar flare", 
       "timeMachine": true, 
       "reliable": false 
      } 
     } 
    } 

ли кто-нибудь, почему заказывающий подделки? Как я могу переупорядочить элементы по значению заголовка?

ответ

5

Ваш объект items не является массивом, а просто объектом с именованными членами. Эти члены не имеют неотъемлемого порядка.

Например, при создании console.log({ your object }) в хроме будут заданы свойства, отсортированные по имени участника, в данном случае «звездные» и «tardis» в указанном порядке. Но записывая for(k in x.items) console.log(k) для одного и того же объекта, будет (в Chrome - опять же, без надежной спецификации здесь) перебирать объекты в том порядке, в котором они были определены, и записывать «tardis», «stargate».

Это упорядочение является артефактом представления объекта, а не самого объекта. Использовать массивы, если вы хотите заказать:

{ 
    "count": 3, 
    "items": [ 
     { 
      "key": "stargate", 
      "type": "Milky way gate", 
      "title": "Stargate + solar flare", 
      "timeMachine": true, 
      "reliable": false 
     }, 
     { 
      "key": "tardis", 
      "type": 40, 
      "title": "Tardis", 
      "timeMachine": true, 
      "reliable": true 
     } 
    ] 
} 
+1

Действительно. Спецификация свойств объектов не гарантируется. –

3

Ключи объекта не в определенном порядке. Они могут быть возвращены в любом порядке после того, как они будут помещены в объект javascript. Это так, как язык был разработан и как указано.

Если вы хотите, чтобы они были в определенном порядке, вам либо нужны данные в массиве (который упорядочен), либо вам нужен упорядоченный индекс только для ключей, которые позволят вам получить доступ к ключам в желаемом порядке ,

Массивы имеют последовательный порядок, объекты нет.

Она смотрит на меня, как вы можете структуру данных, которая выглядит следующим образом:

{ 
    "count": 3, 
    "items": [ 
     { 
      "name": "tardis", 
      "type": 40, 
      "title": "Tardis", 
      "timeMachine": true, 
      "reliable": true 
     }, 
      "name": "stargate", 
      "type": "Milky way gate", 
      "title": "Stargate + solar flare", 
      "timeMachine": true, 
      "reliable": false 
     } 
    ] 
} 

Таким образом, элементы в массиве с определенным порядком: items[0], items[1] и т.дом ...

FYI, когда вы делаете это таким образом, вам не нужно значение "count", потому что массив items будет иметь items.length.

Без значения счетчика, вся ваша реакция может быть просто массив объектов:

[ 
     { 
      "name": "tardis", 
      "type": 40, 
      "title": "Tardis", 
      "timeMachine": true, 
      "reliable": true 
     }, 
      "name": "stargate", 
      "type": "Milky way gate", 
      "title": "Stargate + solar flare", 
      "timeMachine": true, 
      "reliable": false 
     } 
    ] 
1

Если вы читали спецификацию JSON в http://www.json.org/, Вы столкнетесь с этой линии - Объект является неупорядоченный набор пар имя/значение

Следовательно, неразумно доверять упорядочению ключей в объекте. Объявите его как массив, и вы можете получить свой заказ.

Смежные вопросы