绑定数据似乎正在起作用,但没有附加任何内容

时间:2013-08-07 15:55:11

标签: d3.js

这是我上周询问的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中所做的是:

  1. 为每个小组制作一个表格
  2. 为小组总计附加一行
  3. 附加“总计”
  4. 中未包含的密钥
  5. 为“总计”中的每件商品添加更多内容
  6. 然后有一个函数在单击父表时添加子行/单元格
  7. 第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);
                    });
    

1 个答案:

答案 0 :(得分:1)

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