1

如果我有一个包含 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 的任何内容

4

1 回答 1

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/

于 2012-11-10T17:13:15.290 回答