总和D3 .rollup

问题描述:

我试图让每个按键的总和平均在对象的嵌套数组,如下所示:总和D3 .rollup

var data = [ 
    {department:'Electro',quant:{M:30, T:20, W:51, R:22, F:35 }}, 
    {department:'Beauty'',quant:{M:50, T:32, W:75, R:61, F: 45}}, 
    {department:'Apparel'',quant:{M:62, T:42, W:135, R: 82, F:89}}, 
    {department:'Misc',quant:{M:89, T:54, W:103, T:94, F:90}} 
]; 

所以我需要的总和各部门分开。即总和= {'Elecro':158,'Beauty':263}

我正在使用汇总方法,但examples不适用于嵌套数组。

var deptSum = d3.nest() 
.key(function(d) { return d.dept; }) 
.rollup(function(v) { return { 
    count: v.length, 
    total: d3.sum(v, function(d) {return d.quant; }), 
    avg: d3.mean(v, function(d) {return d.quant; }) 
}; }) 
.entries(data) 

的console.log(JSON.stringify(deptSum))

不过是给我的0的款项。

有一个D3方法来获得汇总内的总和(以及平均值)。但问题是,既d3.sumd3.mean期待一个阵列,但quant只是一个对象:

quant: {M:30, T:20, W:51, R:22, F:35 }; 

解决方案:使用D3方法来获得属性值,称为d3.values。根据documentation,它:

返回包含指定对象(关联数组)的属性值的数组。

因此,您rollup应该是:

.rollup(function(v) { 
    return { 
     count: v.length, 
     total: d3.sum(d3.values(v[0].quant)), 
     avg: d3.mean(d3.values(v[0].quant)) 
    }; 
}) 

这里是一个演示:

var data = [ 
 
    {department:'Electro',quant:{M:30, T:20, W:51, R:22, F:35 }}, 
 
    {department:'Beauty',quant:{M:50, T:32, W:75, R:61, F: 45}}, 
 
    {department:'Apparel',quant:{M:62, T:42, W:135, R: 82, F:89}}, 
 
    {department:'Misc',quant:{M:89, T:54, W:103, T:94, F:90}} 
 
]; 
 

 
var deptSum = d3.nest() 
 
.key(function(d) { return d.department; }) 
 
.rollup(function(v) { return { 
 
    count: v.length, 
 
    total: d3.sum(d3.values(v[0].quant)), 
 
    avg: d3.mean(d3.values(v[0].quant)) 
 
}; }) 
 
.entries(data) 
 

 
console.log(deptSum)
<script src="https://d3js.org/d3.v4.min.js"></script>

+0

这很好。谢谢! –

你甚至都不需要为D3,这里是一个纯JS的解决方案:

var sumData = data.map(function(d) { 
    var sum = Object.values(d.quant).reduce((a, b) => a + b) 
    return { department: d.department, sum: sum} 
}).reduce(function(result, item) { 
    result[item.department] = item.sum; 
    return result; 
}, {}) 

会给你{"Electro":158,"Beauty":263,"Apparel":410,"Misc":376}

https://jsfiddle.net/96msy7jd/1

+0

这工作太,但它似乎是D3的方法可以使用较少的代码生成它,以获得像平均值,计数等嵌套数组的其他统计信息。我可以做到G。 –