总和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.sum
和d3.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>
答
你甚至都不需要为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}
+0
这工作太,但它似乎是D3的方法可以使用较少的代码生成它,以获得像平均值,计数等嵌套数组的其他统计信息。我可以做到G。 –
这很好。谢谢! –