sorted.js (936B)
1 function comparer(a, b) { 2 const ma = /.(\d+)\W*$/.exec(a); 3 const mb = /.(\d+)\W*$/.exec(b); 4 if (ma == null || mb == null || ma[1] == mb[1]) { 5 return a < b ? -1 : a > b ? 1 : 0; 6 } else { 7 const na = +ma[1], 8 nb = +mb[1]; 9 return na < nb ? -1 : na > nb ? 1 : 0; 10 } 11 } 12 13 function binaryLookup(ar, i, comparer) { 14 if (ar.length == 0) { 15 return { found: false, index: 0 }; 16 } 17 let l = 0, 18 r = ar.length - 1; 19 while (l < r) { 20 const mid = Math.floor((l + r) / 2); 21 if (comparer(ar[mid], i) < 0) { 22 l = mid + 1; 23 } else { 24 r = mid; 25 } 26 } 27 const result = comparer(ar[l], i); 28 if (result === 0) { 29 return { found: true, index: l }; 30 } 31 return { 32 found: false, 33 index: result < 0 ? l + 1 : l 34 }; 35 } 36 37 export function fancySort(input) { 38 return input.reduce((ar, i) => { 39 const { index } = binaryLookup(ar, i, comparer); 40 ar.splice(index, 0, i); 41 return ar; 42 }, []); 43 }