diff options
author | (quasar) nebula <qznebula@protonmail.com> | 2023-06-26 08:44:44 -0300 |
---|---|---|
committer | (quasar) nebula <qznebula@protonmail.com> | 2023-06-26 08:44:44 -0300 |
commit | 160c6c4c92f0c574981bab9fabd5f2d06cb0bf10 (patch) | |
tree | ef773399ff6ab47be788913bbcde2f7e8ac45cad /src/util | |
parent | 1deb589b2e22d92f6488d259ce6196706f1515b1 (diff) |
util: new sortEntryThingPairs util
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/wiki-data.js | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/util/wiki-data.js b/src/util/wiki-data.js index 8a2897d2..382f1620 100644 --- a/src/util/wiki-data.js +++ b/src/util/wiki-data.js @@ -3,6 +3,7 @@ import { accumulateSum, empty, + unique, } from './sugar.js'; // Generic value operations @@ -315,6 +316,33 @@ export function sortChronologically(data, { return data; } +// This one's a little odd! Sorts an array of {entry, thing} pairs using +// the provided sortFunction, which will operate on each item's `thing`, not +// its entry (or the item as a whole). If multiple entries are associated +// with the same thing, they'll end up bunched together in the output, +// retaining their original relative positioning. +export function sortEntryThingPairs(data, sortFunction) { + const things = unique(data.map(item => item.thing)); + sortFunction(things); + + const outputArrays = []; + const thingToOutputArray = new Map(); + + for (const thing of things) { + const array = []; + thingToOutputArray.set(thing, array); + outputArrays.push(array); + } + + for (const item of data) { + thingToOutputArray.get(item.thing).push(item); + } + + data.splice(0, data.length, ...outputArrays.flat()); + + return data; +} + // Highly contextual sort functions - these are only for very specific types // of Things, and have appropriately hard-coded behavior. |