Javascript d3.js按汇总字段排序

Javascript d3.js按汇总字段排序,javascript,d3.js,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":"In

我有一个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}]
按我所需的输出为(按汇总值排序)

我该怎么做?我知道下面的浏览器默认排序方法也会提供所需的输出。但是,只想弄清楚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;
})));
console.log(JSON.stringify(countryCount.sort)(函数a,b){
如果(a.values>b.values){return-1;}
else如果(a.values
不,没有内置函数提供您想要的结果
d3.nest()
确实有一种方法可以对嵌套数据的叶元素进行排序,但这在您的情况下是没有意义的,因为您确实应用了
.rollup()
,每个键只剩下一个叶。正如您已经提到的,方法是使用。

D3提供条件,您可以使用inside on。不用担心,您使用的是带有nice的本机javascript方法

d3在nest函数中提供了一个方法,它将根据您选择的键对嵌套列表进行排序。根据您的要求,您可以通过
d3.升序
d3.降序


从你的例子来看:

var countryCount = d3.nest() .key(function(d) { return d.Country; }) .sortKeys(d3.ascending) .entries(data); var countryCount=d3.nest() .key(函数(d){返回d.Country;}) .排序键(d3.升序) .条目(数据); 这将给你:

[{"key":"India","values":4},{"key":"UK","values":3},{"key":"USA","values":1}]
[{“key”:“India”,“values”:4},{“key”:“UK”,“values”:3},{“key”:“USA”,“values”:1}]您可以使用countryCount.sort(函数(a,b){d3.升序(a.values,b.values)})我知道浏览器默认的排序方法也会给出所需的输出。但我只是想弄清楚d3.js是否提供了任何内置方法来实现这一点,我认为没有必要。array.sort如果简单,除了d3之外,它还提供了两个帮助函数d3.ascending和d3.decending。即使d3.js最后提供了
内置排序
,它也只会使用
本机排序
方法,所以使用/选择哪一种方法并不重要。正如Nisfan建议的那样,使用.sortKeys(),虽然@SriramajeyamSugumaran接受了这个答案作为正确答案,但它并没有显示d3进行排序的方式。您应用的
sort()
方法不是d3的API之一,而是OP已经提到的
Array.prototype.sort()
。您只是将
d3.ascending()
放在使用中,通过查看链接到的文档/实现,它在逻辑上等同于上述问题中的比较函数。没有内置的函数可以根据请求对叶节点进行排序。事实上,这是@user1465639在对问题的第一次评论中提出的相同解决方案,OP拒绝了该解决方案,因为它不是理想的d3唯一方法。我在这里帮助人们,唯一的想法是,如果@user1465639获得部分荣誉,我同意你的看法。你能做的最好的选择是改进你的答案,或者说我错了,这是建立协作知识的方法。不要把它当成个人问题,它不是有意冒犯你的!这个问题清楚地问到,是否有一个内置的解决方案来对嵌套数据进行排序,它与d3一起提供。这一核心问题用粗体字表示。据我所知,这个问题的答案是“不,没有这样的事情。”OP还表示知道不感兴趣的
Array.prototype.sort()
。正如我的评论所指出的,这就是你提出的方法。可能这就是@SriramajeyamSugumaran撤销接受您的答案的原因,因为它没有直接解决问题。这是可行的,但它需要是“值”而不是“值”,所以(a.value,b.value)。不知道这是否是d3的一个变化,因为答案已经发布了。(加上我需要将其设置为d3。先降序以获得最大值)是的,但这是按键排序:印度->英国->美国。这只是巧合,它与值字段所需的4->3->1排序匹配。为什么不能先汇总,然后根据“值”排序?它应该能解决你的问题。 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}]