2015-01-27 3 views
1

У меня есть простой Ajax вызов, который выглядит следующим образом:ParseJSON сортирует мои JSON данные

var data = jQuery.parseJSON(response.d); 

В response.d содержание:

{"d":"[[{\"ExtensionData\":{},\"categoryId\":\"Help\"}],{\"11\":\"This is 11\",\"10\":\"This is 10\",\"7\":\"This is 7\",\"6\":\"This is 6\",\"12\":\"This is 12\",\"5\":\"This is 5\",\"4\":\"This is 4\",\"2\":\"This is 2\",\"1\":\"This is 1\"}]"} 

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

  1. "Это 1"
  2. «Это я s 2"
  3. "Это 3"
  4. "Это 4"
  5. "Это 5"
  6. "Это 6"

... и так далее, вы получите идея. Почему он сортируется внезапно? Как отключить «автосортирование»?

+2

'parseJSON()' не сортирует. Вероятно, это больше связано с вашим способом прохождения результирующего массива. – Sirko

+2

Взгляните на это: [Является ли заказ на объект объекта гарантии JavaScript?] (Http://stackoverflow.com/questions/5525795/does-javascript-guarantee-object-property-order) – llernestal

+0

@Sirko: 'parseJSON' doesn ' t sort * вообще *. Нет «действительно» об этом. –

ответ

7

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

Edit:

Возможное решение вашей проблемы будет включать в себя массив объектов ключей в дополнение к вашей коллекции ключ-значение (исходный объект) для вашего ответа сервера. Итерируя по упорядоченным клавишам, вы можете получить доступ к объекту в том порядке, в котором вы хотите.

E.g.

var data = { 
    values: { /* your original object here */ }, 
    /* keep a record of key order and include the keys as an array 
     in your response. That way you can guarantee order. */ 
    keys: [11, 10, 7, 6, 12, 5, 4, 2, 1] 
}; 

data.keys.forEach(function (key) { 
    var value = data.values[key]; 

    /* do work here */ 
}); 
+0

Чтобы добавить его в мое раскрывающееся меню, мне нужно значение и текст. Итак, я создаю два массива? – RangerChris

+0

@ RangerChris Ну, один из способов мог бы сохранить ваш объект, содержащий пары ключ-значение, как есть, но, кроме того, включить массив с объектными ключами, упорядоченными по мере необходимости. –

+0

@RangerChris Я добавил фрагмент кода к моему ответу, который, надеюсь, поможет прояснить мое предложенное решение. –

0

jQuery.parseJSON(); не сортирует ваши объекты. Но некоторые браузеры сортируют ваши объекты после рендеринга. Для уточнения см. here

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