d3使用d3.map和d3 queue()函数读取csv

时间:2016-02-28 17:00:56

标签: javascript csv d3.js mapping

我想映射到每个省的数据城市。

这是我的示例csv数据。 (a.k.a'city.csv')

citycode,province,name
3704051,ProvinceA,city1
3704052,ProvinceA,city2
3704054,ProvinceA,city3
3704062,ProvinceA,city4
3704056,ProvinceA,city5
3704058,ProvinceA,city6
3704059,ProvinceA,city7
3704060,ProvinceB,city8
3704061,ProvinceB,city9
3704063,ProvinceB,city10
3702011,ProvinceC,city11
3702012,ProvinceC,city12

映射后,我希望得到省的所有东西。 例如,如果我输入值'省',则返回'3704051','3704052'..等等

首先,我必须阅读这样的数据。

var popByProvinceName = d3.map()

queue()
  .defer(d3.json, "municipalities.json")
  .defer(d3.csv, "city.csv", function(d) {
    d.citycode = +d.citycode;
    popByProvinceName.set(d.province, + d.citycode);
  }).await(ready);

function ready(error, data1) {
  console.log(popByProvinceName.get("ProvinceA");
}

只按省份返回一个城市代码。

 3704059

我该如何解决?请帮忙!

1 个答案:

答案 0 :(得分:1)

每次迭代都会覆盖该值。你需要将它们推入一个数组:

queue()
  //.defer(d3.json, "municipalities.json")
  .defer(d3.csv, "city.csv", function(d) {
    d.citycode = +d.citycode;
    // first time we've seen province
    if (!popByProvinceName.has(d.province)) {
      popByProvinceName.set(d.province, []);
    }
    // get the array and add to it
    popByProvinceName.get(d.province).push(d.citycode);
  }).await(ready);

完整code

另一种更简洁的方法是在准备好的函数中使用d3.nest

function ready(error, data1) {
  var nest = d3.nest()
    .key(function(d) { return d.province; })
    .rollup(function(r){
      return r.map(function(d){
        return +d.citycode;
      });
    })
    .entries(data1);

完整code