2013-08-30 4 views
2

Je suis toujours nouveau sur d3, et javascript en général, donc la plupart des pratiques que j'ai vues ont toutes à faire avec des tableaux simples, mais jamais des objets. Maintenant, j'essaye de créer un diagramme simple composant une semaine de données en utilisant des données dans un dossier de json. Tout d'abord, la structure de données ressemble quelque peu à la manière suivante avec des valeurs arbitraires:Filtrage des données JSON pour d3.js

{"2013-08-21":{"orders":"10","revenue":"1000"}, 
{"2013-08-22":{"orders":"20","revenue":"1800"}, 
{"2013-08-23":{"orders":"15","revenue":"1200"}, 
...} 

Le problème que je suis confronté est maintenant à essayer de comprendre comment passer efficacement les dates dans le domaine XScale, ainsi que les commandes ou les revenus dans le domaine yScale. Si elle était un fichier CSV ou TSV, je pouvais utiliser ceci:

xScale.domain(d3.extent(data, function(d) {return d.date;})); 
yScale.domain(d3.extent(data, function(d) {return d.orders;})); 

Mais quand j'ai essayé de faire la même chose avec l'objet JSON, il me dit ce qui suit:

Uncaught TypeError: #<Object> is not a function 

Peut quelqu'un s'il vous plaît aider à faire la lumière sur ce sujet? Je pourrais essayer de créer des tableaux de listes pour les dates, les commandes et les revenus, mais y a-t-il une autre approche?

Merci pour votre temps!

EDIT

Le TypeError se produirait lorsque je tente de cartographier les données après l'importation du fichier JSON:

d3.json("report.json", function(error, json) { 
    if (error) return console.warn(error); 
    dataset = json; 
    dataset = dataset.map(function(d){ 
     var date = d3.keys(d)[0]; 
     d[date].date = date; 
     return d[date]; 
    }); 
}); 

Plus précisément, sur cette ligne:

dataset = dataset.map(function(d){ ... }) 

Uncaught TypeError: Object #<Object> has no method 'map' 
+0

Quel est le code qui lance 'TypeError'? – nrabinowitz

+0

Salut nrabinowitz, s'il vous plaît se référer à la section éditée ci-dessus. Merci! – peianwu

+0

désolé, je pense que j'ai peut-être compris comment réorganiser les données au format dont j'avais besoin. Merci pour la suggestion! – peianwu

Répondre

4

Vous avez essentiellement deux options ici: 1. Munge vos données dans un format plus facile à traiter 2. Essayez de traiter votre format actuel.

Je pense que (1) va vous rendre la vie plus facile dans la plupart des cas:

data = data.map(function(d) { 
    // get the date 
    var date = d3.keys(d)[0]; 
    // put it into the inner object 
    d[date].date = date; 
    // return the inner object 
    return d[date]; 
}); 

Cela vous donne des lignes comme

{ 
    "orders": "10", 
    "revenue": "1000", 
    "date": "2013-08-21" 
} 

qui sont beaucoup plus faciles à traiter. Cela pourrait aussi être une bonne idée d'analyser la date comme vous le faites.

+0

Bonjour nrabinowitz, merci pour la réponse rapide! Je vais essayer d'approfondir votre solution car j'ai toujours le même problème "Uncaught TypeError", ce qui m'empêche de dupliquer votre réponse. – peianwu

+0

pour formater votre json il y a beaucoup de sites Web pour le faire librement et facilement – tomtomtom

+0

Merci Tom! Désolé, je suis vraiment nouveau avec tout cela, donc je ne savais pas que quelque chose existait. Je vais certainement y réfléchir aussi. – peianwu