使用D3.rollup计算嵌套JSON数组的总和

3

我正在尝试获取嵌套对象数组中每个键的总和和平均值,其格式如下:

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

我需要分别计算每个部门的总和,即sum = {'电子': 158,'美容': 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)

console.log(JSON.stringify(deptSum))

但是这会给我返回所有总和都是0的结果。

2个回答

1

您甚至不需要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


这也可以运行,但似乎D3方法可以用更少的代码生成嵌套数组的其他统计数据,如平均值、计数等。我可能错了。 - Math Stout

1
在 rollup 中有一个 D3 方法可以获取总和(以及平均值)。然而问题在于,d3.sumd3.mean 都需要一个数组,但是 quant 只是一个对象。
quant: {M:30, T:20, W:51, R:22, F:35 };
解决方案: 使用 D3 方法获取属性值,称为 d3.values。根据 文档, 它会返回一个包含指定对象(一个关联数组)的属性值的数组。

因此,您的 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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接