我正在尝试更改提供D3地图的json文件的格式。原始消息来源是palewire的World Choropleth。
编辑:工作代码要感谢Plunker中的以下回答: http://embed.plnkr.co/JYTATyrksAg3OJ0scHAp/
原始json是嵌套格式,其中每个值都有一个计数:
{
"id": "IQ-G02-D009",
"rate": "1"
},
{
"id": "IQ-G05-D030",
"rate": "4"
},
{
"id": "IQ-G07-D047",
"rate": "5"
}
]
新的json将使用平面格式,例如:
[
{
"id": "IQ-G02-D009"
},
{
"id": "IQ-G05-D030"
},
{
"id": "IQ-G05-D030"
},
{
"id": "IQ-G05-D047"
},
{
"id": "IQ-G07-D047"
}
]
使用汇总和嵌套功能似乎是获得与前一个相似形式的新json的前进方式,但是却被困于在queue()中实现它们。
汇总应该在.defer级别上实现:
queue()
.defer(d3.json, "map.json")
.defer(d3.json, "data.json")
.await(ready);
我可以直接在队列中使用嵌套和汇总功能吗?
答案 0 :(得分:0)
您有一些错字对您不利。正如cal_br_mar所说,您的问题的一般答案是:加载数据时套用嵌套并汇总。所以:
queue()
.defer(d3.json, "map.json")
.defer(d3.json, "data.json")
.await(ready)
function ready(error, country, activities) {
activities = d3.nest()
.key(function(d) {
return d.id;
})
.rollup(function(v) {
return v.length;
})
.entries(activities);
}
您在最后一行输入了错字:应该是activities
,而不是expenses
(我猜错了粘贴和粘贴)。
在随后的代码中应该是:
activities.forEach(function(d) {
rateById[d.key] = +d.values;
});
nest()
和rollup
将数据放入key
和values
属性中,如您在控制台输出的嵌套数据中所见:
[{"key":"IQ-G02-D009","values":1},{"key":"IQ-G05-D030","values":2},{"key":"IQ-G05-D047","values":1},{"key":"IQ-G07-D047","values":1}]
更改这些字段,就可以了。