2012-11-27 3 views
1

J'ai un fichier JSON comme ceci:Calculer signifie JSON avec d3.js

[ 
{"id":1,"sex":"Female","programming":5, "project":7}, 
{"id":2,"sex":"Male","programming":8, "project":4}, 
{"id":3,"sex":"Female","programming":5, "project":6}, 
{"id":4,"sex":"Male","programming":4, "project":7} 
] 

Je veux calculer la moyenne des avec d3.js de la programmation de la valeur que je peux obtenir la moyenne totale de celui-ci comme donc:

function meanVak(value) { 
    return d3.mean(data, function(d) {return d [value] }) 
} 

var meanProgramming = meanVak('programming'); 

Mais maintenant, je veux un moyen distinct de «programmation» basé sur le sexe. Donc pour les femmes et les hommes. Comment dois-je faire cela?

Répondre

1
// I think the easiest way is to use the d3.nest function. Perhaps something like ... 
var nest = d3.nest() 
    .key(function(d) { return d.sex; }) 
    .sortKeys(d3.ascending) 
    .rollup(function(d) { 
    return { 
     meanVakValue: d3.mean(d, function(g) { return g[value]; }) 
    }; 
    }) 
    .map(data); 

// You may then need to turn it back into entries. I had to use map first then extract to entries 
// but I'm still getting my head around d3. 
var nestedData = d3.entries(nest); 
+0

merci. Je ne comprends pas ce que rollup fait, mais j'ai réussi à faire les bons calculs – user1386906

+0

Le rollup crée essentiellement un nouvel objet qui sera sous la clé. C'est vraiment pratique lorsque vous avez plusieurs valeurs à calculer en une seule fois. – Felan

0

Il me semble que vous avez besoin pour créer un nouveau tableau qui ne contient que les mâles et les femelles/puis utilisez la fonction avec le nouveau tableau, vous pouvez créer le nouveau tableau facilement en utilisant jquery.map().

Regardez HERE pour un exemple.

var data = [ 
{"id":1,"sex":"Female","programming":5, "project":7}, 
{"id":2,"sex":"Male","programming":8, "project":4}, 
{"id":3,"sex":"Female","programming":5, "project":6}, 
{"id":4,"sex":"Male","programming":4, "project":7} 
]; 

var newArray = $.map(obj,function(elem){ 
    return elem.sex === 'Female'? elem :null; 
});