feat: improve notes grouping

this improves performance as well as removes the empty Pinned group array.
This commit is contained in:
thecodrr
2020-09-20 09:46:06 +05:00
parent e056835301
commit 71a19bed97
2 changed files with 12 additions and 11 deletions

View File

@@ -2,7 +2,7 @@ import { groupBy } from "../utils";
test("groupBy should work", () => { test("groupBy should work", () => {
let ret = groupBy([1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3], (x) => x.toString()); let ret = groupBy([1, 2, 3, 1, 1, 1, 2, 2, 2, 3, 3, 3], (x) => x.toString());
expect(ret.length).toBe(16); expect(ret.length).toBe(15);
expect(ret.some((i) => i.title === "1")).toBeTruthy(); expect(ret.some((i) => i.title === "1")).toBeTruthy();
expect(ret.some((i) => i.title === "2")).toBeTruthy(); expect(ret.some((i) => i.title === "2")).toBeTruthy();
expect(ret.some((i) => i.title === "3")).toBeTruthy(); expect(ret.some((i) => i.title === "3")).toBeTruthy();

View File

@@ -1,21 +1,22 @@
import fastsort from "fast-sort"; import fastsort from "fast-sort";
export function groupBy(arr, key, sortSelector) { export function groupBy(arr, key, sortSelector) {
if (sortSelector) fastsort(arr).desc(sortSelector); if (sortSelector)
fastsort(arr).by([{ desc: (t) => t.pinned }, { desc: sortSelector }]);
let groups = { Pinned: [] }; let groups = new Map();
arr.forEach((item) => { arr.forEach((item) => {
let groupTitle = item.pinned ? "Pinned" : key(item); let groupTitle = item.pinned ? "" : key(item);
let group = groups[groupTitle] let arr = groups.get(groupTitle) || [];
? groups[groupTitle] arr.push(item);
: (groups[groupTitle] = []); groups.set(groupTitle, arr);
group.push(item);
}); });
let items = []; let items = [];
for (let group in groups) { groups.forEach((groupItems, groupTitle) => {
items = [...items, { title: group, type: "header" }, ...groups[group]]; items.push({ title: groupTitle, type: "header" });
} groupItems.forEach((item) => items.push(item));
});
return items; return items;
} }