这是我上周询问的this question的后续行动(从那以后我改变了很多东西,所以不要过多关注我发布的代码)。
我的数据组织如下:
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中所做的是:
第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);
});
答案 0 :(得分:1)
totals
是一个Object,而不是一个Array。 D3的数据绑定基于数组。您可以使用以下对象从对象获取一组键名:Object.keys(d.totals);
。