Javascript 使用D3.rollup的嵌套JSON数组的总和
我试图获得嵌套对象数组中每个键的总和和平均值,如下所示:Javascript 使用D3.rollup的嵌套JSON数组的总和,javascript,json,d3.js,Javascript,Json,D3.js,我试图获得嵌套对象数组中每个键的总和和平均值,如下所示: 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}},
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}}
];
所以我需要每个部门的总和。i、 e sum={'Elecro':158,'Beauty':263}
我使用的是rollup方法,但不适用于嵌套数组
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)
log(JSON.stringify(deptSum))
但他给我的总数是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}
请参见有一种D3方法可以在汇总中获得总和(以及平均值)。然而,问题是
d3.sum
和d3.mean
都期望一个数组,但quant
只是一个对象:
quant: {M:30, T:20, W:51, R:22, F:35 };
解决方案:使用D3方法获取属性值,称为D3.values
。根据报告,它:
返回包含指定对象的属性值的数组(关联数组)
因此,您的汇总应该是:
.rollup(function(v) {
return {
count: v.length,
total: d3.sum(d3.values(v[0].quant)),
avg: d3.mean(d3.values(v[0].quant))
};
})
下面是一个演示:
var数据=[
{部门:'Electro',数量:{M:30,T:20,W:51,R:22,F:35},
{部门:'Beauty',数量:{M:50,T:32,W:75,R:61,F:45},
{部门:'服装',数量:{M:62,T:42,W:135,R:82,F:89},
{部门:'Misc',数量:{M:89,T:54,W:103,T:94,F:90}
];
var deptSum=d3.nest()
.key(函数(d){返回d.department;})
.rollup(函数(v){返回{
计数:v.length,
总计:d3.sum(d3.values(v[0].quant)),
平均值:d3.平均值(d3.值(v[0].数量))
}; })
.条目(数据)
console.log(deptSum)
这同样有效,但D3方法似乎可以用更少的代码生成它,以获得嵌套数组的其他统计信息,如平均值、计数等。我可能错了。