首页 > 解决方案 > D3.js.nest 使用reduce进行累积和汇总

问题描述

我正在尝试使用从现有数组中获取累积总和D3.nest

learnjsdata.com 网站有这个例子,使用reduce

var landSum = data.reduce(function(sum, d) {
  return sum + d.land_area;
}, 0);
console.log(landSum);

我试图将其调整d3.nest rollup为如下所示。

var caseByDate = 
    [
      {
        "report_date": "2020-03-30",
        "case_count": 1
      },
      {
        "report_date": "2020-04-03",
        "case_count": 1
      },
      {
        "report_date": "2020-04-07",
        "case_count": 1
      }
    ]
    
var caseByDateCum = d3.nest()
    .key(function(d) { return d.report_date; })
    .rollup(function(v) { 
        return v.reduce(function(sum, d) {
            return sum + d.case_count;
          }, 0);
     })
    .entries(caseByDate)
    .map(function(group) {
        return {
            report_date: group.key,
            cum_case_count: group.value
        }
    });

console.log(caseByDateCum);
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

但不返回累积和,它只返回 cum_case_count 中的原始数据。我期望结果是:

var caseByDateCum = 
[
  {
    "report_date": "2020-03-30",
    "cum_case_count": 1
  },
  {
    "report_date": "2020-04-03",
    "cum_case_count": 2
  },
  {
    "report_date": "2020-04-07",
    "cum_case_count": 3
  }
]

我找不到任何有助于描述如何使用reduceind3.nest rollup来获取累积总数的搜索。

Reduce sum应该是一个“累加器”,v值是一个按值分组的数字数组key。所以它应该在里面工作rollup

我错过了什么?

标签: javascriptd3.js

解决方案


我认为使用纯javascript会更容易:

let caseByDate = [
    {
        "report_date": "2020-03-30",
        "case_count": 1
    },
    {
        "report_date": "2020-04-03",
        "case_count": 1
    },
    {
        "report_date": "2020-04-07",
        "case_count": 1
    }
];


caseByDate.forEach(function (e) {
    this.count = (this.count || 0) + e.case_count;
    e.case_count = this.count;
}, Object.create(null));

console.log(caseByDate);


推荐阅读