2016-02-28 67 views
1

我想映射到各省的数据城市。d3使用d3.map和d3队列()函数读取csv

这是我的示例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 

映射后,我想要得到所有省份的东西。 例如,如果我把值'省A',返回'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

您将覆盖每次迭代的值。您需要将它们推入阵列中:

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

+0

太棒了!非常感谢! – DDanggle