最初は、次のフィールドを持つcsvからのフラットハッシュ構造があります。
zoneId,op,metricName,value
それから私はそれを入れ子にします
d3.nest()
.key(function(d){return d.zoneId})
.key(function(d){return d.op})
.entries(data)
これで、次のような階層になります。
zoneId -> op -> <details>
これがデータの例です
nestedData = {
[{
"key": "zone1",
"values": [{
"key": "Get",
"values": [{
"zoneId":"zone1"
"op":"Get"
"metricName":"CompletionTime",
"value":"10ms"
}, {
"zoneId":"zone1"
"op":"Get"
"metricName":"Throughput",
"value":"100 query/s"
}]
},{
/* Similar to the "values" of last bracket */
}]
}]
}, {
"key": "zone2",
"values": [
/* Similar to the "values" of last bracket */
]
}]
}]
}
次に、このネストデータ構造からテーブルを作成します。
- 各ゾーンはテーブルを占有します
- 各操作は行です
- 各行で
- 左の列はop名です
- 右の列は、メトリックのフォーマットされたバージョンです(「10ms @ 100QPS」など)。
問題は:
データを<tr>プレースホルダーにバインドするにはどうすればよいですか?<table>にはデータがありますが、<tr>が<tbody>の下にあるときに、それらを<table>に追加すると、<tbody>にはデータがありません。
var tables = d3.select('#perfs .metrics')
.selectAll('table')
.data(nestedData)
.enter().append('table');
/* added tbody and data */
tables.append('tbody')
.selectAll('tr')
.data(???).enter()
.append('tr')
.selectAll('td')
.data(function(d){return [d.key,d.value];}) // left and right column
.enter().append('td')
.text(function(d){ /* iterate through the metrics and format them */ })
これが私が考えることができる2つの解決策です:
- tbodyにデータを割り当てます(ただし、ハッキーに聞こえます!)
- this.parentNode .__ data __にアクセスします(これもハッキーに聞こえます!)
何かアドバイスはありますか?