Skip to content

Commit e7bd9a6

Browse files
committed
groupSort
1 parent d473c3b commit e7bd9a6

File tree

4 files changed

+61
-0
lines changed

4 files changed

+61
-0
lines changed

src/groupSort.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import ascending from "./ascending.js";
2+
import group, {rollup} from "./group.js";
3+
import sort from "./sort.js";
4+
5+
export default function groupSort(values, reduce, key) {
6+
return (reduce.length === 1
7+
? sort(rollup(values, reduce, key), (([ak, av], [bk, bv]) => ascending(av, bv) || ascending(ak, bk)))
8+
: sort(group(values, key), (([ak, av], [bk, bv]) => reduce(av, bv) || ascending(ak, bk))))
9+
.map(([key]) => key);
10+
}

src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export {default as deviation} from "./deviation.js";
99
export {default as extent} from "./extent.js";
1010
export {default as fsum, Adder} from "./fsum.js";
1111
export {default as group, groups, index, indexes, rollup, rollups} from "./group.js";
12+
export {default as groupSort} from "./groupSort.js";
1213
export {default as bin, default as histogram} from "./bin.js"; // Deprecated; use bin.
1314
export {default as thresholdFreedmanDiaconis} from "./threshold/freedmanDiaconis.js";
1415
export {default as thresholdScott} from "./threshold/scott.js";

test/data/barley.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[{"yield":27,"variety":"Manchuria","year":1931,"site":"University Farm"},{"yield":48.86667,"variety":"Manchuria","year":1931,"site":"Waseca"},{"yield":27.43334,"variety":"Manchuria","year":1931,"site":"Morris"},{"yield":39.93333,"variety":"Manchuria","year":1931,"site":"Crookston"},{"yield":32.96667,"variety":"Manchuria","year":1931,"site":"Grand Rapids"},{"yield":28.96667,"variety":"Manchuria","year":1931,"site":"Duluth"},{"yield":43.06666,"variety":"Glabron","year":1931,"site":"University Farm"},{"yield":55.2,"variety":"Glabron","year":1931,"site":"Waseca"},{"yield":28.76667,"variety":"Glabron","year":1931,"site":"Morris"},{"yield":38.13333,"variety":"Glabron","year":1931,"site":"Crookston"},{"yield":29.13333,"variety":"Glabron","year":1931,"site":"Grand Rapids"},{"yield":29.66667,"variety":"Glabron","year":1931,"site":"Duluth"},{"yield":35.13333,"variety":"Svansota","year":1931,"site":"University Farm"},{"yield":47.33333,"variety":"Svansota","year":1931,"site":"Waseca"},{"yield":25.76667,"variety":"Svansota","year":1931,"site":"Morris"},{"yield":40.46667,"variety":"Svansota","year":1931,"site":"Crookston"},{"yield":29.66667,"variety":"Svansota","year":1931,"site":"Grand Rapids"},{"yield":25.7,"variety":"Svansota","year":1931,"site":"Duluth"},{"yield":39.9,"variety":"Velvet","year":1931,"site":"University Farm"},{"yield":50.23333,"variety":"Velvet","year":1931,"site":"Waseca"},{"yield":26.13333,"variety":"Velvet","year":1931,"site":"Morris"},{"yield":41.33333,"variety":"Velvet","year":1931,"site":"Crookston"},{"yield":23.03333,"variety":"Velvet","year":1931,"site":"Grand Rapids"},{"yield":26.3,"variety":"Velvet","year":1931,"site":"Duluth"},{"yield":36.56666,"variety":"Trebi","year":1931,"site":"University Farm"},{"yield":63.8333,"variety":"Trebi","year":1931,"site":"Waseca"},{"yield":43.76667,"variety":"Trebi","year":1931,"site":"Morris"},{"yield":46.93333,"variety":"Trebi","year":1931,"site":"Crookston"},{"yield":29.76667,"variety":"Trebi","year":1931,"site":"Grand Rapids"},{"yield":33.93333,"variety":"Trebi","year":1931,"site":"Duluth"},{"yield":43.26667,"variety":"No. 457","year":1931,"site":"University Farm"},{"yield":58.1,"variety":"No. 457","year":1931,"site":"Waseca"},{"yield":28.7,"variety":"No. 457","year":1931,"site":"Morris"},{"yield":45.66667,"variety":"No. 457","year":1931,"site":"Crookston"},{"yield":32.16667,"variety":"No. 457","year":1931,"site":"Grand Rapids"},{"yield":33.6,"variety":"No. 457","year":1931,"site":"Duluth"},{"yield":36.6,"variety":"No. 462","year":1931,"site":"University Farm"},{"yield":65.7667,"variety":"No. 462","year":1931,"site":"Waseca"},{"yield":30.36667,"variety":"No. 462","year":1931,"site":"Morris"},{"yield":48.56666,"variety":"No. 462","year":1931,"site":"Crookston"},{"yield":24.93334,"variety":"No. 462","year":1931,"site":"Grand Rapids"},{"yield":28.1,"variety":"No. 462","year":1931,"site":"Duluth"},{"yield":32.76667,"variety":"Peatland","year":1931,"site":"University Farm"},{"yield":48.56666,"variety":"Peatland","year":1931,"site":"Waseca"},{"yield":29.86667,"variety":"Peatland","year":1931,"site":"Morris"},{"yield":41.6,"variety":"Peatland","year":1931,"site":"Crookston"},{"yield":34.7,"variety":"Peatland","year":1931,"site":"Grand Rapids"},{"yield":32,"variety":"Peatland","year":1931,"site":"Duluth"},{"yield":24.66667,"variety":"No. 475","year":1931,"site":"University Farm"},{"yield":46.76667,"variety":"No. 475","year":1931,"site":"Waseca"},{"yield":22.6,"variety":"No. 475","year":1931,"site":"Morris"},{"yield":44.1,"variety":"No. 475","year":1931,"site":"Crookston"},{"yield":19.7,"variety":"No. 475","year":1931,"site":"Grand Rapids"},{"yield":33.06666,"variety":"No. 475","year":1931,"site":"Duluth"},{"yield":39.3,"variety":"Wisconsin No. 38","year":1931,"site":"University Farm"},{"yield":58.8,"variety":"Wisconsin No. 38","year":1931,"site":"Waseca"},{"yield":29.46667,"variety":"Wisconsin No. 38","year":1931,"site":"Morris"},{"yield":49.86667,"variety":"Wisconsin No. 38","year":1931,"site":"Crookston"},{"yield":34.46667,"variety":"Wisconsin No. 38","year":1931,"site":"Grand Rapids"},{"yield":31.6,"variety":"Wisconsin No. 38","year":1931,"site":"Duluth"},{"yield":26.9,"variety":"Manchuria","year":1932,"site":"University Farm"},{"yield":33.46667,"variety":"Manchuria","year":1932,"site":"Waseca"},{"yield":34.36666,"variety":"Manchuria","year":1932,"site":"Morris"},{"yield":32.96667,"variety":"Manchuria","year":1932,"site":"Crookston"},{"yield":22.13333,"variety":"Manchuria","year":1932,"site":"Grand Rapids"},{"yield":22.56667,"variety":"Manchuria","year":1932,"site":"Duluth"},{"yield":36.8,"variety":"Glabron","year":1932,"site":"University Farm"},{"yield":37.73333,"variety":"Glabron","year":1932,"site":"Waseca"},{"yield":35.13333,"variety":"Glabron","year":1932,"site":"Morris"},{"yield":26.16667,"variety":"Glabron","year":1932,"site":"Crookston"},{"yield":14.43333,"variety":"Glabron","year":1932,"site":"Grand Rapids"},{"yield":25.86667,"variety":"Glabron","year":1932,"site":"Duluth"},{"yield":27.43334,"variety":"Svansota","year":1932,"site":"University Farm"},{"yield":38.5,"variety":"Svansota","year":1932,"site":"Waseca"},{"yield":35.03333,"variety":"Svansota","year":1932,"site":"Morris"},{"yield":20.63333,"variety":"Svansota","year":1932,"site":"Crookston"},{"yield":16.63333,"variety":"Svansota","year":1932,"site":"Grand Rapids"},{"yield":22.23333,"variety":"Svansota","year":1932,"site":"Duluth"},{"yield":26.8,"variety":"Velvet","year":1932,"site":"University Farm"},{"yield":37.4,"variety":"Velvet","year":1932,"site":"Waseca"},{"yield":38.83333,"variety":"Velvet","year":1932,"site":"Morris"},{"yield":32.06666,"variety":"Velvet","year":1932,"site":"Crookston"},{"yield":32.23333,"variety":"Velvet","year":1932,"site":"Grand Rapids"},{"yield":22.46667,"variety":"Velvet","year":1932,"site":"Duluth"},{"yield":29.06667,"variety":"Trebi","year":1932,"site":"University Farm"},{"yield":49.2333,"variety":"Trebi","year":1932,"site":"Waseca"},{"yield":46.63333,"variety":"Trebi","year":1932,"site":"Morris"},{"yield":41.83333,"variety":"Trebi","year":1932,"site":"Crookston"},{"yield":20.63333,"variety":"Trebi","year":1932,"site":"Grand Rapids"},{"yield":30.6,"variety":"Trebi","year":1932,"site":"Duluth"},{"yield":26.43334,"variety":"No. 457","year":1932,"site":"University Farm"},{"yield":42.2,"variety":"No. 457","year":1932,"site":"Waseca"},{"yield":43.53334,"variety":"No. 457","year":1932,"site":"Morris"},{"yield":34.33333,"variety":"No. 457","year":1932,"site":"Crookston"},{"yield":19.46667,"variety":"No. 457","year":1932,"site":"Grand Rapids"},{"yield":22.7,"variety":"No. 457","year":1932,"site":"Duluth"},{"yield":25.56667,"variety":"No. 462","year":1932,"site":"University Farm"},{"yield":44.7,"variety":"No. 462","year":1932,"site":"Waseca"},{"yield":47,"variety":"No. 462","year":1932,"site":"Morris"},{"yield":30.53333,"variety":"No. 462","year":1932,"site":"Crookston"},{"yield":19.9,"variety":"No. 462","year":1932,"site":"Grand Rapids"},{"yield":22.5,"variety":"No. 462","year":1932,"site":"Duluth"},{"yield":28.06667,"variety":"Peatland","year":1932,"site":"University Farm"},{"yield":36.03333,"variety":"Peatland","year":1932,"site":"Waseca"},{"yield":43.2,"variety":"Peatland","year":1932,"site":"Morris"},{"yield":25.23333,"variety":"Peatland","year":1932,"site":"Crookston"},{"yield":26.76667,"variety":"Peatland","year":1932,"site":"Grand Rapids"},{"yield":31.36667,"variety":"Peatland","year":1932,"site":"Duluth"},{"yield":30,"variety":"No. 475","year":1932,"site":"University Farm"},{"yield":41.26667,"variety":"No. 475","year":1932,"site":"Waseca"},{"yield":44.23333,"variety":"No. 475","year":1932,"site":"Morris"},{"yield":32.13333,"variety":"No. 475","year":1932,"site":"Crookston"},{"yield":15.23333,"variety":"No. 475","year":1932,"site":"Grand Rapids"},{"yield":27.36667,"variety":"No. 475","year":1932,"site":"Duluth"},{"yield":38,"variety":"Wisconsin No. 38","year":1932,"site":"University Farm"},{"yield":58.16667,"variety":"Wisconsin No. 38","year":1932,"site":"Waseca"},{"yield":47.16667,"variety":"Wisconsin No. 38","year":1932,"site":"Morris"},{"yield":35.9,"variety":"Wisconsin No. 38","year":1932,"site":"Crookston"},{"yield":20.66667,"variety":"Wisconsin No. 38","year":1932,"site":"Grand Rapids"},{"yield":29.33333,"variety":"Wisconsin No. 38","year":1932,"site":"Duluth"}]

test/groupSort-test.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
const tape = require("tape-await");
2+
const d3 = require("../");
3+
const barley = require("./data/barley.json");
4+
5+
tape("groupSort(data, reduce, key) returns sorted keys when reduce is an accessor", (test) => {
6+
test.deepEquals(
7+
d3.groupSort(barley, g => d3.median(g, d => d.yield), d => d.variety),
8+
["Svansota", "No. 462", "Manchuria", "No. 475", "Velvet", "Peatland", "Glabron", "No. 457", "Wisconsin No. 38", "Trebi"]
9+
);
10+
test.deepEquals(
11+
d3.groupSort(barley, g => -d3.median(g, d => d.yield), d => d.variety),
12+
["Trebi", "Wisconsin No. 38", "No. 457", "Glabron", "Peatland", "Velvet", "No. 475", "Manchuria", "No. 462", "Svansota"]
13+
);
14+
test.deepEquals(
15+
d3.groupSort(barley, g => d3.median(g, d => -d.yield), d => d.variety),
16+
["Trebi", "Wisconsin No. 38", "No. 457", "Glabron", "Peatland", "Velvet", "No. 475", "Manchuria", "No. 462", "Svansota"]
17+
);
18+
test.deepEquals(
19+
d3.groupSort(barley, g => d3.median(g, d => d.yield), d => d.site),
20+
["Grand Rapids", "Duluth", "University Farm", "Morris", "Crookston", "Waseca"]
21+
);
22+
test.deepEquals(
23+
d3.groupSort(barley, g => -d3.median(g, d => d.yield), d => d.site),
24+
["Waseca", "Crookston", "Morris", "University Farm", "Duluth", "Grand Rapids"]
25+
);
26+
test.deepEquals(
27+
d3.groupSort(barley, g => d3.median(g, d => -d.yield), d => d.site),
28+
["Waseca", "Crookston", "Morris", "University Farm", "Duluth", "Grand Rapids"]
29+
);
30+
});
31+
32+
tape("groupSort(data, reduce, key) returns sorted keys when reduce is a comparator", (test) => {
33+
test.deepEquals(
34+
d3.groupSort(barley, (a, b) => d3.ascending(d3.median(a, d => d.yield), d3.median(b, d => d.yield)), d => d.variety),
35+
["Svansota", "No. 462", "Manchuria", "No. 475", "Velvet", "Peatland", "Glabron", "No. 457", "Wisconsin No. 38", "Trebi"]
36+
);
37+
test.deepEquals(
38+
d3.groupSort(barley, (a, b) => d3.descending(d3.median(a, d => d.yield), d3.median(b, d => d.yield)), d => d.variety),
39+
["Trebi", "Wisconsin No. 38", "No. 457", "Glabron", "Peatland", "Velvet", "No. 475", "Manchuria", "No. 462", "Svansota"]
40+
);
41+
test.deepEquals(
42+
d3.groupSort(barley, (a, b) => d3.ascending(d3.median(a, d => d.yield), d3.median(b, d => d.yield)), d => d.site),
43+
["Grand Rapids", "Duluth", "University Farm", "Morris", "Crookston", "Waseca"]
44+
);
45+
test.deepEquals(
46+
d3.groupSort(barley, (a, b) => d3.descending(d3.median(a, d => d.yield), d3.median(b, d => d.yield)), d => d.site),
47+
["Waseca", "Crookston", "Morris", "University Farm", "Duluth", "Grand Rapids"]
48+
);
49+
});

0 commit comments

Comments
 (0)