2011-02-01 15 views
12

Ho alcuni dati JSON in un oggetto mappa che è ordinato per ora. La chiave è un ID intero e il valore è un oggetto che contiene un timestamp. Tuttavia, quando provo ad eseguire iterazioni su questi dati con la funzione $ .each di jQuery, i risultati tornano ordinati in base alla chiave. Come posso scorrere la mia collezione di oggetti nel loro ordine originale?Iterate su oggetto JSON jQuery nell'ordine originale

Codice esempio:

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

risposta

6

è possibile copiare le coppie di valori chiave in un array di oggetti e quindi utilizzare Array.sort per metterli in ordine.

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

mio script di test:

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

In realtà sono andato con qualcosa di simile a quello che hai postato, ma il tuo snippet è pieno di errori di sintassi btw. – Doug

+0

Mi dispiace per gli errori di sintassi - L'ho risolto ora. (Sto incolpando di tarda notte e recente esposizione a Ruby) –

11

oggetti sono insiemi non ordinata. Non è possibile specificare un ordine su di essi in una modalità di reclamo cross-browser. Non esiste alcun concetto di ordine originale a meno che non sia già ordinato da una regola.

Quindi ordinare i dati sul server e quindi eseguire l'enumerazione su di esso nello stesso ordine.

alternativa formattare il JSON sia

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

È possibile iterare la matrice con un for (i = 0; i < len; i++) ciclo e "seguro" l'ordine originale.

0

Se per "originale" si intende il timestamp nell'oggetto, non penso ci sia alcuna opzione infallibile se non quella di ordinare prima l'array in modo esplicito, e solo dopo di esso.

2

Negli oggetti firefox mantengono l'ordine .. in chrome no. Non ho idea di altro browser, ma due implementazioni diverse mostrano già che non puoi fare affidamento su di esso.

Se avete bisogno di qualcosa ordinato, usate una lista; se avete bisogno di qualcosa con entrambe le chiavi non numeriche e un certo ordine, il modo più semplice sarebbe utilizzando un elenco di [key, value] liste:

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

ecco il link per quanto riguarda la questione in Chrome: http://code.google.com/p/v8/issues/detail?id=164 –

+0

Qualsiasi motivo per preferire la tupla [k, v] su un oggetto {k: v}? – Raynos

+0

@FelixKing non è un problema tanto quanto una lacuna nell'implementazione. Ci sono tutti validi, solo non coerenti. – Raynos