2010-12-07 24 views
3
[ 
    {"task":"test","created":"/Date(1291676980607)/"}, 
    {"task":"One More Big Test","created":"/Date(1291677246057)/"}, 
    {"task":"New Task","created":"/Date(1291747764564)/"} 
] 

J'ai regardé ici, et quelqu'un a eu le même genre de question, mais la réponse correcte "vérifié" était que ce sera différent sur IE si l'article est supprimé, ce qui serait bien. Mon problème est, ces éléments ci-dessus sont stockés, mais quand je vais les saisir, itérer, et retourner, les éléments sont inversés et le created est à l'index 0 et task est au 1. Aussi, je dois retourner ceci en JSON.Comment inverser JSON dans JavaScript?

Voici ma (valeur == un int l'utilisateur passe dans) JS base:

outputJSON = {}; 
for(x in json[value]){ 
    outputJSON[x] = _objectRevival(json[value][x]); 
} 
return outputJSON; 

Cela revient:

created: Mon Dec 06 2010 15:09:40 GMT-0800 (Pacific Standard Time) 
task: "test" 

Répondre

4

L'ordre des propriétés d'un objet est indéfini. Il n'est pas possible de les forcer dans un ordre spécifié. Si vous avez besoin dans un ordre précis, vous pouvez construire cette structure fiable en utilisant des réseaux:

var values = [ 
    [["task", "test"],    ["created", "/Date(1291676980607)/"]], 
    [["task", "One More Big Test"], ["created", "/Date(1291677246057)/"]], 
    [["task", "New Task"],   ["created", "/Date(1291747764564)/"]] 
]; 

Ensuite, vous pouvez itérer sur votre structure comme celle-ci:

for (var i = 0; i < values.length; i++) { 
    for (var k = 0; k < values[i]; k++) { 
     // values[i][k][0] contains the label (index 0) 
     // values[i][k][1] contains the value (index 1) 
    } 
} 
+0

Si vous avez besoin d'une commande, vous devez stocker vos données différemment, par exemple sous la forme d'un tableau de baies à deux éléments ou d'un tableau d'objets paire clé/valeur. –

+0

@ Matti Virkkunen: J'ai résolu cela un peu différent ici pour économiser de la mémoire. – jwueller

+0

OP n'a pas précisé exactement s'il connaît toutes les propriétés à l'avance ou non, ou si l'ordre doit effectivement suivre les données, quel que soit l'ordre dans lequel il entre. –

0

Le problème est que javascript objets n » t stocker leurs propriétés dans un ordre spécifique. Les tableaux sur l'autre font (d'où la raison pour laquelle vous pouvez obtenir quelque chose de cohérent de json [0], json [1], json [2]).

Si vos objets auront toujours "tâche" et "créé", alors vous pouvez les obtenir dans l'ordre que vous voulez.

json[value]["task"] 

et

json[value]["created"] 

Mise à jour: Cela devrait fonctionner avec votre code existant. Avant d'envoyer l'objet JSON:

var before = [ 
    {"task":"test","created":"/Date(1291676980607)/"}, 
    {"task":"One More Big Test","created":"/Date(1291677246057)/"}, 
    {"task":"New Task","created":"/Date(1291747764564)/"} 
]; 
var order = []; 
for (var name in before[0]) { 
    order.push(name); // puts "task", then "created" into order (for this example) 
} 

Ensuite, envoyez votre JSON hors du serveur. Plus tard, quand vous obtenez les données à partir du serveur:

var outputJSON = {}; 
for (var x in order) { 
    if (order.hasOwnProperty(x)) { 
     outputJSON[order[x]] = _objectRevival(json[value][order[x]]); // I'm not sure what _objectRevival is...do you need it? 
    } 
} 
return outputJSON; 
+0

Ouais, je le souhaite, mais ils ne le feront pas. C'est juste un cas d'utilisation de démonstration. Ils peuvent stocker n'importe quoi. –

+0

ok, alors avant de stocker les objets, pouvez-vous pousser leurs noms dans un tableau, afin de préserver l'ordre d'origine? Ensuite, lorsque vous le récupérez, lisez-les en fonction de l'ordre du tableau (parcourez le tableau et obtenez json [valeur] [tableau [i]]). – DaveS

+0

'_objectRevival()' le fait si certaines données ont été stockées qui était un 'objet', par exemple, si un utilisateur met un objet' Date() ', il le convertit en .getTime() puis le met en'/Date (12345 ...)/'et _objectRevival()' le fait * back * dans un objet 'Date()' ou un autre objet, ou, s'il ne correspond à aucun objet prédéfini, ce que je lui ai redonné. –

0

Pour appliquer un ordre particulier pour votre sortie il suffit de remplacer json[value] dans votre boucle for avec un tableau des propriétés d'objet dans l'ordre que vous souhaitez les afficher, dans votre cas ["task", "created"].

0
var items = ["bag", "book", "pen", "car"]; 
items.reverse(); 

Cela se traduira par la sortie suivante:

car , pen, book, bag 

Même si vous avez tableau JSON elle remontera.