在 D3/JS 中合并两个数据集
2017-04-30
888
我正在尝试创建一个简单的“即插即用”地图模板,该模板允许用户将包含大地水准面和值的 csv 文件放入其中,然后将这些值视为等值线图。
现在,我正在使用双循环合并两个数据集(地图和值),但想知道是否还有其他选择:
此代码块保留在加载地理数据 (fresh_ctss) 的函数内:
d3.csv("data/communities_pop.csv", function(error, comms)
{
csv = comms.map(function(d)
{
//each d is one line of the csv file represented as a json object
// console.log("Label: " + d.CTLabel)
return {"community": d.community, "population" :d.population,"label": d.tract} ;
})
csv.forEach(function(d, i) {
fresh_ctss.forEach(function(e, j) {
if (d.label === e.properties.geoid) {
e.properties.community = parseInt(d.community)
e.properties.population = parseInt(d.population)
}
})
})
1个回答
您肯定需要两个循环(或一个嵌套循环) - 最佳方法是仅限制需要发生的迭代次数。现在,第一个循环遍历每个 csv 行。以下嵌套循环遍历每个 csv 行(作为新的不同对象),然后遍历 csv 中行数最多的
fresh_ctss
中的每个项目。
如果您将行映射到对象而不是数组中,则可以遍历行一次(总计),然后遍历
fresh_ctss
的元素一次(再次,总计)。以下代码假设
comms
中没有
tract
重复项:
all_comms = {}
comms.forEach(function(d) {
all_comms[d.tract] = {"community": d.community, "population": d.population}
})
fresh_ctss.forEach(function(e) {
comm = all_comms[e.properties.geoid]
e.properties.community = parseInt(comm.community)
e.properties.population = parseInt(comm.population)
}
mef79
2017-05-02