28 votes

Comment convertir au format JSON de D3 ?

En suivant de nombreux exemples D3, les données sont généralement formatées dans le format donné dans flare.json :

{
 "name": "flare",
 "children": [
  {
   "name": "analytics",
   "children": [
    {
     "name": "cluster",
     "children": [
      {"name": "AgglomerativeCluster", "size": 3938},
      :

J'ai une liste d'adjacence comme suit :

A1 A2
A2 A3
A2 A4

que je veux convertir au format ci-dessus. Actuellement, je fais cela côté serveur, mais existe-t-il un moyen d'y parvenir en utilisant les fonctions de d3 ? J'en ai trouvé une aquí Mais cette approche semble nécessiter une modification de la bibliothèque centrale de d3, ce à quoi je ne suis pas favorable pour des raisons de maintenabilité. Avez-vous des suggestions ?

43voto

mbostock Points 25336

Il n'y a pas de format prescrit, car vous pouvez généralement redéfinir vos données à l'aide de diverses fonctions d'accès (telles que la fonction hiérarchie.enfants ) et tableau.map . Mais le format que vous avez cité est probablement la représentation la plus pratique pour les arbres car elle fonctionne avec les accesseurs par défaut.

La première question est de savoir si vous avez l'intention d'afficher une graphique ou un arbre . Pour les graphes, la structure de données est définie en termes de nœuds y liens . Pour les arbres, l'entrée de la disposition est le nœud Root, qui peut avoir un tableau de nœuds enfants et dont les nœuds feuilles sont associés à un valeur .

Si vous voulez afficher un graphique et tout ce que vous avez est une liste d'arêtes, alors vous voudrez itérer sur les arêtes afin de produire un tableau de nœuds et un tableau de liens. Supposons que vous ayez un fichier appelé "graph.csv" :

source,target
A1,A2
A2,A3
A2,A4

Vous pouvez charger ce fichier en utilisant d3.csv et produire ensuite un tableau de nœuds et de liens :

d3.csv("graph.csv", function(links) {
  var nodesByName = {};

  // Create nodes for each unique source and target.
  links.forEach(function(link) {
    link.source = nodeByName(link.source);
    link.target = nodeByName(link.target);
  });

  // Extract the array of nodes from the map by name.
  var nodes = d3.values(nodeByName);

  function nodeByName(name) {
    return nodesByName[name] || (nodesByName[name] = {name: name});
  }
});

Vous pouvez ensuite transmettre ces nœuds et ces liens à la disposition des forces pour visualiser le graphique :

Si vous voulez produire un arbre à la place, vous devrez effectuer une forme légèrement différente de transformation des données pour accumuler les nœuds enfants pour chaque parent.

d3.csv("graph.csv", function(links) {
  var nodesByName = {};

  // Create nodes for each unique source and target.
  links.forEach(function(link) {
    var parent = link.source = nodeByName(link.source),
        child = link.target = nodeByName(link.target);
    if (parent.children) parent.children.push(child);
    else parent.children = [child];
  });

  // Extract the root node.
  var root = links[0].source;

  function nodeByName(name) {
    return nodesByName[name] || (nodesByName[name] = {name: name});
  }
});

Comme ça :

4voto

Lars Kotthoff Points 44924

D3 ne requiert pas un format spécifique. Tout dépend de votre application. Vous pouvez certainement convertir une liste d'adjacence au format utilisé dans flare.json, mais il s'agit là encore d'un code spécifique à l'application. En général, vous ne pouvez pas le faire car les listes d'adjacence en tant que telles n'ont pas d'éléments "head" ou "Root" dont vous auriez besoin pour construire un arbre. En outre, il faudrait gérer séparément les cycles, les orphelins, etc.

Étant donné que vous effectuez actuellement la conversion du côté serveur, je serais tenté de dire que "si ce n'est pas cassé, ne le réparez pas" ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X