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方法似乎可以用更少的代码生成它,以获得嵌套数组的其他统计信息,如平均值、计数等。我可能错了。