2008-10-24 5 views
2

Cela semble beaucoup plus compliqué qu'il ne l'est en réalité.Création dynamique de tableaux associatifs en Javascript à partir de JSON

Donc, en Perl, vous pouvez faire quelque chose comme ceci:

foreach my $var (@vars) { 
    $hash_table{$var->{'id'}} = $var->{'data'}; 
} 

J'ai un objet JSON et je veux faire la même chose, mais avec un tableau associatif javascript jQuery.

J'ai essayé ce qui suit:

hash_table = new Array(); 

$.each(data.results), function(name, result) { 
    hash_table[result.(name).extra_info.a] = result.(name).some_dataset; 
}); 

Lorsque les données est un objet JSON obtenu à partir d'un appel .getJSON $. Il ressemble plus ou moins comme ça (ma syntaxe JSON peut être un peu hors, désolé):

{ 
    results:{ 
    datasets_a:{ 
     dataset_one:{ 
     data:{ 
      //stuff 
     } 
     extra_info:{ 
      //stuff 
     } 
     } 
     dataset_two:{ 
     ... 
     } 
     ... 
    } 
    datasets_b:{ 
     ... 
    } 
    } 
} 

Mais chaque fois que je fais cela, Firebug jette l'erreur suivante:

« filtre XML est appliqué à données non-xml »

Répondre

3

Je pense que vous pouvez utiliser la réponse JSON en tant que tableau associatif. Vous devriez donc pouvoir utiliser directement le JSON.

En supposant que vous avez reçu l'exemple ci-dessus:

$('result').innerHTML = data['results']['dataset_a']['dataset_two']['data']; 
// Or the shorter form: 
$('result').innerHTML = data.results.dataset_a.dataset_two.data; 

comprendre que je ne l'ai pas testé, mais il est plus sûr d'utiliser les crochets avec une variable que d'utiliser des parenthèses plus le nom avec le point accesseur.

Votre exemple échoue en raison d'une logique compliquée que je viens de saisir.

$.each(data.results), function(name, result) { 
    hash_table[result.(name).extra_info.a] = result.(name).some_dataset; 
}); 

Maintenant, la boucle foreach passe par la data.results variable pour trouver les éléments internes à une profondeur de 1. L'élément qu'il trouve est donnée à la lambda avec la clé de l'élément. AKA, le premier résultat sera name = "datasets_a" item = object. Me suivre jusqu'ici? Maintenant, vous accédez au hachage retourné, l'objet dans item, comme s'il avait la clé enfant dans name ... "datasets_a". Mais attendez, ce est l'objet! Si tout le reste échoue ... écrivez dynamiquement votre résultat JSON dans un champ de texte et assurez-vous qu'il est correctement formaté.

+0

dans votre dernier bloc de code, il devrait être fonction (nom, résultat). le nom étant la clé, le résultat étant la valeur de cette clé. – Leanan

+0

J'ai accepté la première partie, car il se trouve que je pouvais simplement accéder directement à l'objet json. Stupide de moi de ne pas le réaliser en premier lieu. – Leanan

+0

D'accord, dans MooTools, c'est inversé, donc je suis habitué à ce modèle. –

0

Pourquoi voudriez-vous changer un tableau dans un autre tableau -?)

- pourquoi l'accès non seulement les données, si vous souhaitez simplifier ou filtre, vous pouvez parcourir les tableaux de l'objet directement! -)

0

Cela fonctionne. Juste le jeter dans un bloc de script pour tester.

d = { 
     'results':{ 
     'datasets_a':{ 
      'dataset_one':{ 
      'data':{ 
       'sample':'hello' 
      }, 
      'extra_info':{ 
       //stuff 
      } 
      }, 
     'dataset_two':{ 
      /// 
      } 
      /// 
    }, 
     'datasets_b':{ 
     /// 
     } 
     } 
} 
alert(d.results.datasets_a.dataset_one.data.sample) 

J'espère que ce collé correctement. Cet éditeur n'aime pas mes sauts de ligne dans le code.

d = { 
    'results':{ 
    'datasets_a':{ 
     'dataset_one':{ 
     'data':{ 
      'sample':'hello' 
     }, 
     'extra_info':{ 
      //stuff 
     } 
     }, 
     'dataset_two':{ 
     /// 
     } 
     /// 
    }, 
    'datasets_b':{ 
    /// 
    } 
    } 
}; 

alert(d.results.datasets_a.dataset_one.data.sample) 
Questions connexes