我正在尝试创建一个简单的“即插即用”地图模板,允许用户放置带有大地水准面和值的csv文件,然后将这些值视为一个等值区。
现在我正在使用双循环合并两个数据集(map和values),但想知道是否还有其他选项:
这段代码保留在加载地理数据(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)
}
})
})
答案 0 :(得分:2)
您肯定需要两个循环(或嵌套循环) - 最佳方式是仅限制需要发生的迭代次数。现在,第一个循环遍历每个csv行。以下嵌套循环遍历每个csv行(作为新的不同对象),然后,与csv中的行一样多次遍历fresh_ctss
中的每个项目。
如果将行映射到对象而不是数组,则可以遍历行(总计)一次,然后遍历fresh_ctss
的元素(再次,总计)。以下代码假定tract
中没有comms
个重复项:
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)
}