Перебирать JQuery-объект JSON в оригинальном порядке - PullRequest
12 голосов
/ 01 февраля 2011

У меня есть некоторые данные JSON в объекте карты, отсортированные по времени. Ключ - это целочисленный идентификатор, а значение - это объект, который содержит метку времени. Однако, когда я пытаюсь перебрать эти данные с помощью функции jQuery $ .each, результаты возвращаются отсортированными по ключу. Как я могу перебрать мою коллекцию объектов в их первоначальном порядке?

Пример кода:

$.getJSON(url, addPages);
function addPages(pageData) {
    $.each(pageData, function(key,value){
        alert(key+' : '+value);
    }
}

Ответы [ 4 ]

11 голосов
/ 01 февраля 2011

Объекты - это неупорядоченные множества.Вы не можете указать порядок для них в кросс-браузерной форме жалобы.Не существует понятия исходного порядка, если он не упорядочен по правилу.

Так что сортируйте данные на сервере, а затем перечисляйте их в том же отсортированном порядке.

Альтернативно отформатируйте JSON вbe

{ "values": [
   { "someKey": "someVal" },
   { "someOtherKey": "someOtherVal" }
] }

Вы можете перебирать массив с циклом for (i = 0; i < len; i++) и "гарантировать" исходный порядок.

6 голосов
/ 01 февраля 2011

Вы можете скопировать пары ключ-значение в массив объектов и затем использовать Array.sort, чтобы привести их в порядок.

// $.getJSON(url, addPages); //removed for test purposes
function addPages(pageData) {
    var pageItems = [];
    $.each(pageData, function(key,value){
        pageItems.push( { key: key, value: value } );
    });
    // Assuming you can do arithmetic on timestamps
    pageItems.sort( function(a,b){ return a.value.timeStamp - b.value.timeStamp; } ); 
    $.each(pageItems, function(index,pageItem){
        alert(pageItem.key+' : '+pageItem.value.timeStamp);
    });
}

Мой тестовый скрипт:

var testData = { 
  '12': { timeStamp: 55 },
  '16': { timeStamp: 655 },
  '123': { timeStamp: 455 },
  '312': { timeStamp: 955 },
  '132': { timeStamp: 255 },
  '126': { timeStamp: 455 },
  '162': { timeStamp: 355 }
  };
addPages(testData);
2 голосов
/ 01 февраля 2011

В Firefox объекты сохраняют порядок .. в Chrome они этого не делают. Нет представления о другом браузере, но две разные реализации уже показывают, что на него нельзя положиться.

Если вам нужно что-то заказать, используйте список; если вам нужно что-то с нечисловыми ключами и определенным порядком, проще всего было бы использовать список списков [ключ, значение]:

[['abd', 'def'], ['ghi', 'jkl']]
0 голосов
/ 01 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...