Pregunta sobre jquery, json, javascript – Agregar algo a la parte superior de un objeto JSON

7

Tengo un objeto JSON que se inicia cuando se carga la página, como esto:

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

¿Hay una manera de inyectar un elemento antes de la primerafoo elemento, de modo que al hacer unafor var i in data, ¿el nuevo elemento se integrará antes de los elementos que se agregaron cuando se inició el objeto?

La razón es que estoy mostrando algunos artículos al usuario. Cuando el usuario agrega un nuevo elemento a través de javascript, quiero que este nuevo elemento se muestre sobre 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 como yo quiero, que es:

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

¿Algunas ideas?

este tema es probablemente relevante A saber, la parte que dice: Si el orden es relevante,utilizar una matriz. James Holmes

Tu respuesta

6   la respuesta
14

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

Mejor uso matrices en su lugar. Podrías usar elunshift() Método para poner el elemento en el primer índice.

var data = [bar,bar2,bar3];

data.unshift(newItem);

//data = [newItem,bar,bar2,bar3];
@ClickUpvoteArray.unshift() mira mi respuesta Las matrices tienenuna serie de métodos de manipulación puedes usar comopush para agregar al final,pop para quitar el final,shift para quitar el primero etc. Joseph
No es una opción, ya la he codificado como un objeto. Tendré que cambiarlo en un par de lugares para usar una matriz. ¿Cuál es una forma de hacerlo funcionar como un objeto? Click Upvote
@Click Upvote Puede usar una matriz como un objeto.var arr = []; arr.foo = 'bar'; Lo único es que no podrás acceder a eso.foo dentro de unafor(var i = 0; i < arr.length; i++){...}. Por lo tanto, su código existente puede ser el mismo. Todavía puedes acceder a ellos dentrofor(var key in data){...} bucle, incluso si cambia sudata = []. user405398
0

puede crear un nuevo objeto y organizar el orden de las propiedades que desee. ejemplo:

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

Así que crea un nuevo objeto con la nueva propiedad que deseas en la parte superior:

var obj2 = {age: 21}

y la carrera:

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

obj2 = {age: 21, name: "viru", lastname: "nehra"}
-3

agregar sus datos al principio de la cadena y luego volver a convertir la cadena a json usando "eval"

ok, lo usaré de ahora en adelante, muchas gracias! Samir Adel
En lugar deeval podrías haber usadoJSON.parse. user405398
Aléjate del teclado. Incognito
Por favor, investigue por qué no debería usar eval. Luego, averigüe por qué no debería convertir objetos en cadenas y viceversa ... Incognito
8

Como un cumplido aJose el soñadoresresponder, He ejecutado algunos controles rápidos en Firefox y 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

Cromo:

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
3

¿Hay una manera de inyectar un elemento antes del primer elemento foo?

Lo que viene primero en la matriz:

¿window.object o window.alert?

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

Si tu quieres

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

Usa una matriz.

Si tu quieres:

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

ThingsNeverInOrder.foo = bar;

Usa un objeto.

3

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

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

Preguntas relacionadas