sort-unwind
v4.1.0
Published
Sort an array and get the inverse permutation (argsort) to undo it, or apply the same sort order to parallel arrays
Maintainers
Readme
Sort Unwind
Sort an array and get back the permutation that undoes it. Give unwind an array of ranks and an array of values, and it returns the values in sorted order along with the inverse permutation (an argsort) — so you can undo the sort later, or apply the same sort order to other parallel arrays.
Zero dependencies, dual ESM/CJS build, TypeScript types included.
Install
npm install --save sort-unwindUsage
import { unwind } from 'sort-unwind'
const suits = ['♥', '♠', '♣', '♦']
const ranks = [2, 0, 3, 1]
const [sortedSuits, tenet] = unwind(ranks, suits)
// sortedSuits <- ['♠', '♦', '♥', '♣']
// tenet <- [1, 3, 0, 2]The sorted array retains the stochastic tenet of the initial array, so you can restore the entropy back into the array, or perhaps apply that entropy to another array. Sort of like sending that array backward in time to the more chaotic state.
const names = ['spades', 'diamonds', 'hearts', 'clubs']
const [tenetNames, tenetRanks] = unwind(tenet, names)
// tenetNames <- ['hearts', 'spades', 'clubs', 'diamonds']
// tenetRanks <- [2, 0, 3, 1]A curried version of the function also exists which can be convenient.
import { curried } from 'sort-unwind'
const prerankedUnwind = curried([2, 0, 3, 1])
const suits = ['♥', '♠', '♣', '♦']
const [sortedSuits, tenet] = prerankedUnwind(suits)
// sortedSuits <- ['♠', '♦', '♥', '♣']
// tenet <- [1, 3, 0, 2]When would I use this?
- Undo a sort — display an array sorted, then restore it to its original order without keeping a copy.
- Sort parallel arrays together — sort one array by another, then apply the same permutation to any number of sibling arrays and keep them all aligned.
- Reverse a seeded shuffle — after a fast-shuffle, unwind puts the deck back in order, or deals the same shuffle to another deck.
- Invert a permutation — the returned indices are the inverse permutation of the sort, useful anywhere an argsort is.
