这是我上周提出的这个问题的后续(从那以后我已经改变了很多东西,所以不要太关注我发布的代码)。
我的数据是这样组织的:
dataset = {
'name': 'total',
'groups': [
{
'name': 'foo',
'children': [ {c1},{c2}...], // key: value pairings
'totals': { key1: val1, ....} // where val1 = sum of key1 from all children
},
// and so on
]
}
我在 D3 中所做的是:
- 为每组制作一张桌子
- 为组总计附加一行
- 为那些未包含在“总计”中的键附加 th
- 为“总计”中的每个项目附加更多
- 然后有一个功能可以在单击父表时添加子行/单元格
第 4 项是我遇到麻烦的地方。以下是我尝试过的两种情况:
// (1) This works
parentTotals.selectAll('th.totals')
.data(tbs) // tbs is a list of the key names in 'totals'
.enter()
.append('th')
.attr('class', 'totals')
.text(function(d) { return d; });
// (2) This does not work
parentTotals.selectAll('th.totals')
.data(function(d) { return d.totals; }) // inherits a child from dataset.groups
.enter()
.append('th')
.attr('class', 'totals')
.text(function(d, i) { return d[tbs[i]]; });
我相信在场景 2 中数据被正确绑定的原因是,如果我在组中的每个成员console.log(d.totals);
之前return d.totals;
添加一个可爱的对象。Object { key1: val1, .... }
因此,如果数据被绑定,为什么不附加任何单元格?谢谢你。
== 编辑 ==
使用 Scott 提供的信息,我已经成功了。如果有人感兴趣,这就是我所做的:
parentTotals.selectAll('th.totals')
.data(function(d) {
return Object.keys(d.totals).map(function(k, i) {
return d.totals[tbs[i]];
})
})
.enter()
.append('th')
.attr('class', function(d, i) { return tbs[i]; })
.text(function(d, i) {
return (d/1000).toFixed(1);
});