2012-05-27 10 views
7

Tengo un objeto JSON que se inicia cuando se carga la página, así:agregar algo a la parte superior de un objeto JSON

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

¿Hay una manera de inyectar un elemento antes de la primera foo elemento, de modo que al hacer un for var i in data, el elemento nuevo se bucle antes de los elementos que se agregaron cuando se inició el objeto?

La razón es que estoy mostrando algunos elementos para el usuario. Cuando el usuario añade un nuevo elemento a través de JavaScript, quiero que este nuevo elemento que se muestra por encima de todos los elementos existentes, sin embargo cuando agrego el nuevo elemento, es decir

data[newItem] = newItem; 

Entonces el objeto JSON se ve así:

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

En lugar de la forma en que quiero, que es:

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

¿Alguna idea?

+0

[este tema] (http: // stackoverflow.com/questions/280713/elements-order-in-a-for-in-loop) es probablemente relevante. A saber, la parte que dice: si el orden es relevante, * use una matriz. * –

Respuesta

13

En JS, no se garantiza el orden de las propiedades del objeto. Por lo tanto, incluso si se ordenan en la cadena JSON, cuando se analizan como un objeto JS, nunca se podrá predecir en qué orden aparecerán.

Mejor utilizar matrices en su lugar. Puede usar el método unshift() para colocar el artículo en el primer índice.

var data = [bar,bar2,bar3]; 

data.unshift(newItem); 

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

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

+0

No es una opción, ya lo he codificado como un objeto Tendré que cambiarlo en un montón de lugares para usar una matriz. ¿Qué es una forma de hacer que funcione como un objeto? –

+0

así que no hay forma de usar 'data [" foo "]' para obtener los datos correspondientes .. Me pregunto si hay bibliotecas que simulen OrderedDict de Python en JavaScript – wong2

-3

Creo que se puede convertirlo a cadena, anexar los datos en el principio de la cadena a continuación, volver a convertir la cadena JSON allí utilizando "eval"

+8

Aléjese del teclado. – Incognito

+0

Intenté ayudar dando ideas –

+0

Investigue por qué no debe usar eval. Luego averigua por qué no deberías convertir objetos a cadenas y viceversa ... – Incognito

3

es una manera de inyectar una elemento antes del primer elemento foo?

¿Qué es lo primero en la matriz:

window.object o window.alert?

Tampoco los objetos tienen un pedido. Si quieres una matriz usa una matriz. Los objetos no son matrices.

Si desea

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

utilizar una matriz.

Si quieren:

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

ThingsNeverInOrder.foo = bar; 

utilizar un objeto.

8

Como un complemento a Joseph the Dreameranswer, he ejecutado algunos controles rápidos en firefox & cromo.

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

me ha tropezado con esto y lo logró usando:

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

Como se mencionó, el orden no está garantizado, pero para mí esto es suficiente. :)

+0

Funcionó perfecto. – AnthonyVO

0

En lugar de agregar un nuevo valor en el mismo objeto, puede crear un nuevo objeto y ordenar las propiedades como desee. ejemplo:

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

Por lo tanto crear un nuevo objeto con la nueva propiedad que desea en la parte superior:

var obj2 = {age: 21} 

y la corrida:

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

obj2 = {age: 21, name: "viru", lastname: "nehra"} 
Cuestiones relacionadas