2012-05-27 12 views
7

Ho un oggetto JSON che viene avviata quando la pagina viene caricata, in questo modo:aggiungendo qualcosa alla parte superiore di un oggetto JSON

data[foo] = bar; 
data[foo2] = bar2; 
data[foo3] = bar3; 

Esiste un modo per iniettare un elemento prima del primo foo elemento, in modo tale che quando si esegue un for var i in data, il nuovo elemento verrà eseguito il ciclo prima degli elementi aggiunti all'avvio dell'oggetto?

Il motivo è che sto visualizzando alcuni elementi all'utente. Quando l'utente aggiunge un nuovo elemento tramite javascript, voglio che questo nuovo elemento da visualizzare sopra tutti gli elementi esistenti, tuttavia quando aggiungo il nuovo elemento, vale a dire

data[newItem] = newItem; 

Poi l'oggetto JSON è simile al seguente:

data[foo] = bar; 
data[foo2] = bar2; 
data[foo3] = bar3; 
data[newItem] = newItem; 

Invece di come voglio, che è:

data[newItem] = newItem; 
data[foo] = bar; 
data[foo2] = bar2; 
data[foo3] = bar3; 

Tutte le idee?

+0

[questo tema] (http: // stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop) è probabilmente rilevante. Vale a dire la parte che dice: Se l'ordine è rilevante, * usa un array. * –

risposta

13

In JS, l'ordine delle proprietà dell'oggetto non è garantito. Pertanto, anche se sono ordinati nella stringa JSON, se analizzati come oggetti JS, non si potrà mai prevedere in quale ordine vengono visualizzati.

Meglio utilizzare gli array. È possibile utilizzare il metodo unshift() per inserire l'articolo nel primo indice.

var data = [bar,bar2,bar3]; 

data.unshift(newItem); 

//data = [newItem,bar,bar2,bar3]; 
+1

Vedi anche http://stackoverflow.com/questions/648139/is-the-order-of-fields-in-a-javascript-object- predictable-when-looping-through-t e http://stackoverflow.com/questions/586182/javascript-insert-item-into-array-at-a-specific-index – georgebrock

+0

Non un'opzione, l'ho già codificato come un oggetto. Dovrò cambiarlo in un giro di milioni di posti per usare un array. Qual è un modo per farlo funzionare come un oggetto? –

+0

quindi non c'è modo di usare 'data [" foo "]' per ottenere i dati corrispondenti ... Mi chiedo se ci sono librerie che simulano OrderedDict di Python in JavaScript – wong2

-3

Penso che si può convertire in stringa, aggiungere i tuoi dati all'inizio della stringa poi ri-convertire la stringa JSON usando "eval"

+8

Allontanati dalla tastiera. – Incognito

+0

Ho provato ad aiutare dando spunti –

+0

Per favore, vai a cercare perché non dovresti usare eval. Quindi scopri perché non dovresti convertire oggetti in stringhe e tornare indietro ... – Incognito

3

C'è un modo per iniettare un elemento prima del primo elemento foo?

Cosa viene prima nella matrice:

window.object o window.alert?

Né gli oggetti non hanno un ordine. Se vuoi un array usa un array. Gli oggetti non sono matrici.

Se volete

var ThingsInOrder = [ 
    FirstThing, 
    SecondThing, 
    ThirdThing 
]; 
ThingsInOrder.push(ForthThing); 

utilizzare un array.

Se si desidera:

var ThingsNeverInOrder = { 
    Window, 
    Alert, 
    Derp, 
    Herp 
}; 

ThingsNeverInOrder.foo = bar; 

utilizza un oggetto.

8

Come complemento allo Joseph the Dreamer di answer, ho eseguito alcuni controlli rapidi in firefox & chrome.

Firefox:

var obj = {}; 

obj.a = 'a'; 
obj.c = 'c'; 
obj.b = 'b'; 
obj['0'] = '0'; 

for(var i in obj){ 
    console.log(i); 
} 

//prints: 
a 
c 
b 
0 

Chrome:

var obj = {}; 

obj.a = 'a'; 
obj.c = 'c'; 
obj.b = 'b'; 
obj['0'] = '0'; 

for(var i in obj){ 
    console.log(i); 
} 

//prints: 
0 
a 
c 
b 
2

Ho inciampato su questo e ha raggiunto utilizzando:

const newObject = Object.assign({first: value}, oldObject)

Come accennato, l'ordine non è garantito ma per me è abbastanza buono. :)

+0

Perfetto. – AnthonyVO

0

Invece di aggiungere un nuovo valore nello stesso oggetto, è possibile creare un nuovo oggetto e disporre l'ordine delle proprietà come si desidera. esempio:

var objj1 = {name:'viru',lastname:'nehra'}; 

Quindi creare un nuovo oggetto con la nuova proprietà che si desidera in alto:

var obj2 = {age: 21} 

e la corsa:

for(var key in objj1){ 
    obj2[key] = objj1[key] 
} 

obj2 = {age: 21, name: "viru", lastname: "nehra"} 
Problemi correlati