d3.js按汇总字段排序

时间:2015-05-27 11:20:30

标签: javascript d3.js

我有一个JSON数据,我希望按字段分组,然后按计数排序。

var data = [{"Name":"Ravi","Country":"India"},
            {"Name":"Alex","Country":"USA"},
            {"Name":"Stew","Country":"UK"},
            {"Name":"Mary","Country":"India"},
            {"Name":"Raju","Country":"India"},
            {"Name":"Bill","Country":"UK"},
            {"Name":"Elisa","Country":"UK"},
            {"Name":"Sharma","Country":"India"}];

和我的d3.js查询如下

var countryCount = d3.nest()
                    .key(function(d) { return d.Country; })
                    .rollup(function(a){return a.length;})
                    .entries(data);
console.log(JSON.stringify(countryCount));

我的输出是

[{"key":"India","values":4},{"key":"USA","values":1},{"key":"UK","values":3}]

按我想要的输出(按汇总值排序)

[{"key":"India","values":4},{"key":"UK","values":3},{"key":"USA","values":1}]

我该怎么做?我知道以下浏览器默认排序方法也提供了所需的输出。但是只想清楚d3.js是否提供了任何内置方法来实现这一目标

console.log(JSON.stringify(countryCount.sort(function (a, b){
    if (a.values > b.values) {return -1;} 
    else if (a.values < b.values) { return 1;} 
    else  return 0;
})));

3 个答案:

答案 0 :(得分:2)

D3提供条件ascending descending,您可以在sort method内使用。不用担心您正在使用带有stability

的本机javascript方法
var countryCount = d3.nest()
                    .key(function(d) { return d.Country; })
                    .rollup(function(a){return a.length;})
                    .entries(data)
                    .sort(function(a, b){ return d3.ascending(a.values, b.values); })

console.log(JSON.stringify(countryCount));

答案 1 :(得分:1)

d3在嵌套函数中提供了一个方法sortKeys,它将根据您选择的键对嵌套列表进行排序。您可以根据您的要求传递d3.ascendingd3.descending

从你的例子:

var countryCount = d3.nest()
                    .key(function(d) { return d.Country; })
                    .sortKeys(d3.ascending)
                    .entries(data);

会给你:

[{"key":"India","values":4},{"key":"UK","values":3},{"key":"USA","values":1}]

答案 2 :(得分:0)

不,没有内置函数给出你想要的结果。 d3.nest()确实有一个方法nest.sortValues(),它会对嵌套数据的叶元素进行排序,但是在你的情况下这是没有意义的,因为你确实应用了.rollup(),每个键只留下一个叶子。正如您已经提到的,要走的路是使用Array.prototype.sort()