Reputation: 11
I want to mapping to data city to each province.
This is my sample csv data. (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
After mapping, I want to get all stuffs with province. For example, If I put the value, 'ProvinceA', return '3704051', '3704052' ..etc
First, I have to read data like this.
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");
}
is return only one citycode by province.
3704059
How can I fix it? please help!
Upvotes: 1
Views: 424
Reputation: 108567
You are overwriting the value with each iteration. You need to push them into an array:
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);
Full code.
An alternate and slightly cleaner way to do this would be to use d3.nest in your ready function:
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);
Full code.
Upvotes: 1