使用d3对整个(更改)对象求和

时间:2012-11-10 13:59:45

标签: jquery d3.js

如果我有一个包含20个键和超过3000个条目的对象,是否有办法使用d3来整理整个对象?

例如,如果我有:

Country: Germany, val2007:9.3, val2008:8.6
Country: Germany,val2007:3.4, val2008:1.0
Country: Austria, val2007:23.0, val2008:9.2
Country: Austria, val2007:1.2, val2007:3.2

我可以按如下方式生成数组吗?

Country: Germany,val2007:12.7, val2008:9.6
Country: Austria, val2007:24.2, val2008:12.4

请记住,我不会一直知道关键名称,'val'字段可以是从val2007和val2008到val1997的任何内容 - > val2017

1 个答案:

答案 0 :(得分:3)

D3没有提供一种简单的方法,但它提供了一些有用的工具。第一个是d3.nestdocs),它可以对特定键上的行进行分组。在那之后,你需要弄清楚如何对德国自己的行进行求和 - 这里我使用Array#reduce,我认为这对于这类问题很有用:

function rollup(rows) {
    return rows.reduce(function(agg, row) {
        // you could pre-calculate this if all rows had the same keys
        d3.keys(row)
            .filter(function(k) { return k !== 'Country' })
            .forEach(function(k) {
                if (!(k in agg)) agg[k] = 0;
                agg[k] += row[k];
            });
        return agg
    }, {});
}

data = d3.nest()
    .key(function(d) { return d.Country; })
    .rollup(rollup)
    .entries(data)
    .map(function(entry) {
        entry.values.Country = entry.key;
        return entry.values;
    });

你可以在这里看到工作小提琴:http://jsfiddle.net/nrabinowitz/MB3yz/