2016-05-25 15 views
2

最近mbostockがd3でデータを使用するベストプラクティスに関して私の質問に答えました。ここには投稿へのリンクがあります。d3.jsで多次元配列を反復する

https://github.com/d3/d3/issues/2828

しかし、私はまだ彼が提案した多次元データを反復処理する方法が混乱している彼のアドバイスに従うことをしようとしています。私はちょうど今のところログデータをコンソールに入れようとしていて、誰かが私がポストに続く実用的な例を作るのを助けてくれることを願っていました。関連するスニペットを下に見ることができます。

あなたは国の別の配列を持つことができますし、二重の値の配列を必要とします。これは、重複して日付を指定するのを避けるために使用されます。実際には、あなただけの組織、国や日付のn次元行列にそれを一般化できます。最も簡潔になり

{ 
     "organizations": ["EA", "EB", "EC"], 
     "countries": ["Netherlands", "Belgium", "France"], 
     "dates": ["Jan_2016", "Feb_2016", "Mar_2016"], 
     "values": [ 
     [ 
      [11.7999, 15.0526, 13.2411], 
      [25.7713, 24.1374, null], 
      [27.6033, 23.6186, 20.2142] 
     ], 
     [ 
      [11.7999, 15.0526, 13.2411], 
      [25.7713, 24.1374, null], 
      [27.6033, 23.6186, 20.2142] 
     ] 
     ] 
    } 

、私は期待していますが、覚えておく必要があるだろうデータにアクセスするディメンション順:私はこのすべての比較的新しいよしかしとして、この結果を達成する方法を理解しようとしてきた

var organization = "EA", 
    country = "Netherlands", 
    date = "Jan_2016", 
    value = data.values[organization][country][date]; // 11.7999 

、それが困難でした。私が見つけた最も有用な資料は、video1 + video2であり、これを参考にしてみようとしています。

私はまだこれを実際に行う方が賢明ではなく、mbostockのデータ構造では不可能なのかどうか、私が何かを見つけていないのかどうかは分かりません。 (私は99.99%が後者であると確信しています)。

ここに私がやろうとしていることがあります。

d3.json("data.json", function(error, data) { 
    if (error) { 
    console.log(error) 
    } else { 
    console.log(data) 
    data = d3.entries(data); 
    console.log(data) 
    } 

    data.forEach(function(d) { 
    var org = Object.keys(data[0]); 
    console.log(org) 
    }) 

}); 

http://plnkr.co/edit/2O9Gn28WuMCE1ajOonzY?p=preview

だから、私が収集することができるものから、私はその後、配列にJSONを回すのforEachのシリーズは、一緒にすべてを結び付けるためにループを生成する必要があります。それは私が本当に苦労していることであり、どんな助けでも大いに感謝されます。

私は

おかげ

答えて

2

は、古き良きforループは、この場合に行くには、おそらく最も明確な方法で、すべてが/質問関連する説明されている願っています:

for (var organization=0; organization<data.organizations.length; organization++) { 
    for (var country=0; country<data.countries.length; country++) { 
    for (var date=0; date<data.dates.length; date++) { 
     console.log(data.values[organization][country][date]); 
    } 
    } 
} 

があることに留意してくださいorganization,countryおよびdateは、ここでは整数です。data.organizations[organization]を使用して実際のラベルにアクセスできます。

多くの柔軟性があります。ループを並べ替えて中間コードを追加できます。

for (var organization=0; organization<data.organizations.length; organization++) { 
    for (var date=0; date<data.dates.length; date++) { 
    var group = []; 
    for (var country=0; country<data.countries.length; country++) { 
     group.push(data.values[organization][country][date]); 
    } 
    console.log("values for "+data.organizations[organization]+" at time "+data.dates[date]+":") 
    console.log(group); 
    } 
} 

PS:たとえば、あなたが各組織と日付の配列を抽出したい場合は代わりにすべてを列挙の単一国(または組織または日付)を取得するには、対応するforループによって置き換えることができます。

var country= data.countries.indexOf("france") 
+0

お返事ありがとうございます!それは動作します:) - 私はそれが特定のデータを明らかにするために条件文を使用してさらにこれを拡大することが可能だと思いますか?つまり、$(this)== france &&月== jan_2016ならばvalue == ... – alexc101

+0

確かに、条件付きを挿入できます。最初からどの要素を知っていれば、direcltyはリスト全体をループするのではなくindexOfを使うことができます(編集を参照) – tarulen

+0

ああ、私は見る!まあ、それは私が必要なすべてだと思う、ありがとうございましたあなたは大規模な助けてきた! – alexc101