简体   繁体   中英

d3.js sorting by rollup field

I am having a JSON data and i want to group by a field and then sort by the count.

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"}];

and my d3.js query is the following

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

and my output is

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

by my desired output is ( sorted by rollup value)

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

How can i do this? I know that the following browser default sort method also gives desired output. But just want to clear whether d3.js provides any inbuilt method to achieve this .

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;
})));

D3 provide the condition, ascending descending and you can use inside on sort method . No worries You are using a native javascript method with nice stability

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));

d3 provides a method sortKeys in nest function which will sort your nested list based on the key you selected. You can pass d3.ascending or d3.descending based on your requirement.

From your example:

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

which will give you:

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

No, there is no built-in function giving the result you are after. d3.nest() does have a methode nest.sortValues() which will sort the leaf elements of nested data, but this is meaningless in your case since you did apply .rollup() leaving you with just one leaf per key. As you already mentioned, the way to go is using Array.prototype.sort() .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM