2017-04-30 13 views
0

単純な「プラグアンドプレイ」マップテンプレートを作成しようとしています。これにより、ユーザーはジオイドと値を含むcsvファイルを配置し、その値をchoroplethとして見ることができます。D3/JSで2つのデータセットをマージする

今私は、二重ループを使用して(マッピングと値)2つのデータセットをマージするが、他の選択肢がある場合は疑問に思って:

このコードの塊は、地理データ(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) 
        } 
       }) 
       }) 

答えて

2

間違いなく2つのループ(またはネストされたループ)が必要です。最も最適な方法は、反復の発生の程度を制限することです。今、最初のループはすべてのcsv行を通過します。次のネストされたループは、(異なる別のオブジェクトとして)すべてのcsv行を通過し、csvに行がある回数だけ、fresh_ctssの各項目を通過します。

配列ではなくオブジェクトに行をマップした場合は、行全体を1回(合計)、次にfresh_ctss(もう一度合計)の行を1回繰り返します。以下のコードは、commstractの重複がないことを前提としています。

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) 
} 
関連する問題