JSON数据聚合的最佳实践是什么?

Cos*_*Cos 1 json aggregate d3.js c3

假设我有以下格式的数据集:

var smallTestData = [
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer1", "REVENUE": "1938.49488391425"},
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer2", "REVENUE": "75.9142774343491"},
{"YEAR": "2009", "MONTH": "1", "CUSTOMER": "Customer2", "REVENUE": "99.3456067931875"} ...];
Run Code Online (Sandbox Code Playgroud)

现在,如果我想绘制一个D3或C3图表来显示每个客户每年和每月的累计收入,我想我最终会得到这样的结果:

   [{"yearMonth":"2009 1","revenueCustomer1":158989,"revenueCustomer2":68181},
    {"yearMonth":"2009 2","revenueCustomer1":171217,"revenueCustomer2":204975},
    {"yearMonth":"2009 3","revenueCustomer1":38477,"revenueCustomer2":46605} ...];
Run Code Online (Sandbox Code Playgroud)

当然,这看起来并不优雅,但那没什么.最糟糕的部分是基于多维度(例如,年,月,客户)的度量(例如收入)的聚合,这对于JSON数据来说是一件痛苦的事情.

我已经尝试编写自己的聚合函数来解决这个问题,但除了手动将值一起添加之外,找不到任何令人满意的解决方案.谁能引导我朝着正确的方向前进?您将如何汇总数据以适应我所描述的图表类型?有没有现成的解决方案?

既然我们正在讨论这个话题,您将如何基于主键加入两个或更多数据集?

谢谢!

Ben*_*all 6

这似乎是破灭的最佳时机d3.nest().请访问https://github.com/mbostock/d3/wiki/Arrays#-nest了解更多信息.

对于您的数据以及您要执行的操作,您可以执行以下操作:

var nestedData = d3.nest().key(function(d) { return d.YEAR + " " + d.MONTH; })
                          .key(function(d) { return d.CUSTOMER; })
                          .rollup(function(leaves) {
                              return d3.sum(leaves, function(d) {
                                  return +d.REVENUE;
                              });
                           })
                           .entries(smallTestData);
Run Code Online (Sandbox Code Playgroud)

这将返回一个类似于的对象:

[ 
    { 
        key: "2009 1",
        values: [
            { 
              key: "Customer1"
              values: 1938.49488391425
            },
            { 
              key: "Customer2"
              values: 175.2598842275366
            }
      },
      { ... }
]
Run Code Online (Sandbox Code Playgroud)

方法d3.nestkey函数定义您希望聚合的对象属性,该rollup函数用于汇总与key函数匹配的所有数据.每个key函数都将创建一个新的嵌套深度.如果您没有该rollup函数,则values每个键的每个键只是数据中与函数中定义的值匹配的所有值的数组key.