0

这是我上周提出的这个问题的后续(从那以后我已经改变了很多东西,所以不要太关注我发布的代码)。

我的数据是这样组织的:

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 中所做的是:

  1. 为每组制作一张桌子
  2. 为组总计附加一行
  3. 为那些未包含在“总计”中的键附加 th
  4. 为“总计”中的每个项目附加更多
  5. 然后有一个功能可以在单击父表时添加子行/单元格

第 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);
                });
4

1 回答 1

1

totals是一个对象,而不是一个数组。D3 的数据绑定是基于数组的。您可以使用以下方法从对象中获取键名数组: Object.keys(d.totals);

于 2013-08-07T16:05:46.790 回答