我有一个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;
})));
答案 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.ascending
或d3.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()
。