合并D3 / JS中的两个数据集

时间:2017-04-30 16:47:08

标签: javascript d3.js

我正在尝试创建一个简单的“即插即用”地图模板,允许用户放置带有大地水准面和值的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)
                  }
                })
              })

1 个答案:

答案 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)
}