如何将D3 nest()中丢失的键的计数设置为零

时间:2019-01-18 10:25:06

标签: javascript d3.js

我正在使用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年没有Completed项目,请将Completed键设置为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
}]
}]

1 个答案:

答案 0 :(得分:2)

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

因此,您将不得不用自己的代码填补空白。它可以通过多种方式完成。一种是将.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>