2011-02-01 10 views
12

Mam dane json w obiekcie mapy, który jest posortowany według czasu. Klucz jest identyfikatorem całkowitym, a wartością jest obiekt zawierający znacznik czasu. Jednak gdy próbuję iterować te dane za pomocą funkcji jQuery $ .each, wyniki zostaną zwrócone posortowane według klucza. Jak mogę powtórzyć moją kolekcję obiektów w ich oryginalnej kolejności?Powtórz jQuery Obiekt JSON w oryginalnej kolejności

przykładem Kod:

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

Odpowiedz

6

Można kopiować pary wartość klucza do tablicy obiektów a następnie użyj Array.sort, aby je uporządkować.

// $.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); 
    }); 
} 

Mój skrypt testowy:

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); 
+0

Tak naprawdę poszedłem z czymś takim, jak to, co napisałeś, ale twój fragment jest pełen błędów składniowych. – Doug

+0

Przepraszamy za błędy składni - naprawiłem to teraz. (Obwiniam późne noce i niedawny kontakt z Ruby) –

11

Obiekty są zestawy un-zamówiliśmy. Nie można podać zamówienia na nich w sposób reklamujący w różnych przeglądarkach. Nie ma koncepcji oryginalnego zamówienia, chyba że jest już zamówiona przez regułę.

W ten sposób posortuj dane na serwerze, a następnie wyliczyć je w tej samej posortowanej kolejności.

Alternatywnie formatu JSON być

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

Można iteracyjne nad tablicy z for (i = 0; i < len; i++) pętli „i” garantuee oryginalnej kolejności.

0

Jeśli przez "oryginalny" rozumiesz znacznik czasu w obiekcie, nie sądzę, żeby istniała jakaś niezawierająca opcji opcja, niż najpierw jawnie sortować tablicę, a dopiero potem ją przepętać.

2

W obiektach firefox zachowaj zamówienie .. w chrome nie. Nie mam pojęcia o innej przeglądarce, ale dwie różne implementacje pokazują, że nie można na niej polegać.

Jeśli potrzebujesz czegoś uporządkowanego, użyj listy; jeśli trzeba coś z obu klawiszy non-numeryczne i określonej kolejności, najprostszym sposobem będzie na podstawie listy zawierającej [key, value] list:

[['abd', 'def'], ['ghi', 'jkl']] 
+0

Oto link sprawie emisji w Chrome: http://code.google.com/p/v8/issues/detail?id=164 –

+0

Wszelkie powód do preferowania [k, v] tupla nad obiektem {k: v}? – Raynos

+0

@FelixKing to nie problem tak bardzo jak luka w implementacji. Tam wszystko jest ważne, po prostu nie jest zgodne. – Raynos