首页 > 解决方案 > 如何将 D3 nest() 中缺少的键的计数设置为零

问题描述

我正在使用 d3.js 对来自 .csv 文件的数据进行分组。我正在尝试使用d3.nest()按年份然后按状态获取记录计数。

我的test.csv包含

Year,Project,Status
2018,Project 1,InProgress
2018,Project 2,InProgress
2018,Project 3,InProgress
2017,Project 4,InProgress
2017,Project 5,Completed
2017,Project 6,InProgress
2016,Project 7,Completed

我的代码如下所示:

d3.csv("https://raw.githubusercontent.com/benubah/rconsortium_projects/master/test.csv")
  .then(function(data) {
    var stat = d3.nest()
      .key(function(d) { return d.Year  })
      .key(function(d) { return d.Status }) 
      .rollup(function(v) { return  v.length })
      .entries(data);
      
    console.log(stat);
  });
<script src="https://d3js.org/d3.v5.js"></script>

我期望的输出(由于 2018 年没有已完成的项目,将已完成的键设置为 0):

[Object {
   key: "2018",
   values: [Object {
      key: "InProgress",
      value: 3
}, Object {
      key: "Completed",
      value: 0
}]
},
 Object {
   key: "2017",
   values: [Object {
      key: "InProgress",
      value: 2
}, Object {
      key: "Completed",
      value: 1
}]
},
Object {
   key: "2016",
   values: [Object {
      key: "InProgress",
      value: 0
}, Object {
      key: "Completed",
      value: 1
}]
}]

但我得到的实际输出是:

[Object {
   key: "2018",
   values: [Object {
      key: "InProgress",
      value: 3
}]
},
 Object {
   key: "2017",
   values: [Object {
      key: "InProgress",
      value: 2
}, Object {
      key: "Completed",
      value: 1
}]
},
Object {
   key: "2016",
   values: [Object {
      key: "Completed",
      value: 1
}]
}]

标签: javascriptd3.js

解决方案


原因是那些必须产生带有 条目的年份/状态组合values: 0在源数据中不存在。d3 只迭代现有的组合......

所以你必须用你自己的代码来填补空白。它可以通过多种方式完成。一种是链接 a ,在必要时.map添加缺失的条目:values

d3.csv("https://raw.githubusercontent.com/benubah/rconsortium_projects/master/test.csv")
  .then(function(data) {
    var stat = d3.nest()
      .key(d => d.Year)
      .key(d => d.Status) 
      .rollup(v => v.length)
      .entries(data)
      .map(function (obj) {
           if (obj.values.length === 1) {
               if (obj.values[0].key == "Completed") {
                   obj.values.unshift({ key: "InProgress", values: 0 });
               } else {
                   obj.values.push({ key: "Completed", values: 0 });
               }
           }
           return obj;
      });
      
    console.log(stat);
  });
<script src="https://d3js.org/d3.v5.js"></script>


推荐阅读