Pergunta sobre json, jquery, javascript – Adicionando algo ao topo de um objeto JSON

7

Eu tenho um objeto JSON que é iniciado quando a página é carregada, assim:

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

Existe uma maneira de injetar um elemento antes do primeirofoo elemento, de modo que ao fazer umfor var i in data, o novo elemento será colocado em loop antes dos elementos que foram adicionados quando o objeto foi iniciado?

O motivo é que estou exibindo alguns itens para o usuário. Quando o usuário adiciona um novo item via javascript, eu quero que este novo item seja exibido acima de todos os itens existentes, no entanto, quando eu adicionar o novo item, ou seja,

data[newItem] = newItem;

Então o objeto JSON se parece com isto:

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

Em vez de como eu quero, que é:

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

Alguma ideia?

Este tópico é provavelmente relevante. Ou seja, a parte que diz: Se a ordem é relevante,use uma matriz. James Holmes

Sua resposta

6   a resposta
3

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

Como mencionado, a ordem não é garantida, mas para mim isso é bom o suficiente. :)

8

José o sonhador'sresponda, Fiz algumas verificações rápidas no firefox e no chrome.

Raposa de fogo:

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

Cromada:

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
0

você pode criar um novo objeto e organizar a ordem das propriedades conforme desejar. exemplo:

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

Então crie um novo objeto com a nova propriedade que você quer no topo:

var obj2 = {age: 21}

e a corrida:

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

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

a ordem das propriedades do objeto não é garantida. Portanto, mesmo se eles forem ordenados na sequência JSON, quando analisados ​​como um objeto JS, você nunca poderá prever em que ordem eles aparecerão.

Melhor usar matrizes em vez disso. Você poderia usar ounshift() método para colocar o item no primeiro índice.

var data = [bar,bar2,bar3];

data.unshift(newItem);

//data = [newItem,bar,bar2,bar3];
@ClickUpvoteArray.unshift() veja minha resposta. Matrizes têmuma série de métodos de manipulação você pode usar comopush para adicionar ao final,pop para remover o finalshift para remover o primeiro etc. Joseph
Além disso, com um array, eu teria o mesmo problema. Digamos que um array seja iniciado com 5 elementos, então o usuário adiciona um novo e eu quero movê-lo para o início do array. Como eu faria isso? Click Upvote
Não é uma opção, eu já codifiquei como um objeto. Vou ter que mudar isso em um gazilhão de lugares para usar uma matriz. O que é uma maneira de fazer isso funcionar como um objeto? Click Upvote
então não tem como usardata["foo"] para obter os dados correspondentes ... Estou imaginando se há bibliotecas que simulem o OrderedDict do Python em JavaScript wong2
-3

anexar seus dados no início da string e então reconverter a string para json usando "eval"

Por favor, vá pesquisar por que você não deveria estar usando eval. Então descubra porque você não deveria converter objetos em strings e vice-versa ... Incognito
ok, vou usá-lo a partir de agora, muito obrigado! Samir Adel
Ao invés deeval você poderia ter usadoJSON.parse. user405398
Afaste-se do teclado. Incognito
3

oo?

Qual vem primeiro na matriz:

window.object ou window.alert?

Nenhum dos objetos tem uma ordem. Se você quiser um array, use um array. Objetos não são matrizes.

Se você quiser

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

Use uma matriz.

Se você quiser:

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

ThingsNeverInOrder.foo = bar;

Use um objeto.

Perguntas relacionadas