UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

32 lines (31 loc) 1.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.partialsortperm = partialsortperm; function partialsortperm(values, k, rev = false) { // discuss at: https://locutus.io/julia/partialsortperm/ // parity verified: Julia 1.11 // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Returns 1-based indices of the first k positions in sorted order, similar to Julia partialsortperm(v, 1:k). // example 1: partialsortperm([9, 1, 5, 3], 2) // returns 1: [2, 4] // example 2: partialsortperm([4, 1, 4, 2], 3) // returns 2: [2, 4, 1] // example 3: partialsortperm(['b', 'a', 'c'], 2, true) // returns 3: [3, 1] if (!Array.isArray(values)) { return []; } const count = Math.trunc(Number(k)); if (!Number.isFinite(count) || count <= 0) { return []; } const indexed = values.map((value, index) => ({ value, index: index + 1 })); indexed.sort((left, right) => { if (Object.is(left.value, right.value)) { return left.index - right.index; } const cmp = left.value < right.value ? -1 : 1; return rev ? -cmp : cmp; }); return indexed.slice(0, count).map((entry) => entry.index); }