2012-11-27 7 views
1

Я получил JSon файл как так:Посчитает среднее с JSON 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} 
] 

Я хочу, чтобы вычислить среднее значение-х программирования с D3 JS я могу получить общее среднее из него, как так:

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

var meanProgramming = meanVak('programming'); 

Но теперь я хочу отдельное значение для «программирования» на основе пола. Так что для женщин и мужчин. Как мне это сделать?

ответ

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

спасибо. Я не понимаю, что делает rollup, но мне удалось сделать правильные вычисления. – user1386906

+0

Сводка по существу создает новый объект, который будет находиться под ключом. Это очень удобно, когда у вас есть несколько значений, которые нужно вычислить за один раз. – Felan

0

Кажется мне, как вам нужно, чтобы создать новый массив, содержащий только Самка/Мужчины, а затем использовать функцию с новым массивом, вы можете создать новый массив легко с помощью jquery.map(). В качестве примера можно привести HERE.

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; 
});