开发者问题收集

在 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