bootstrap-vue
Version:
BootstrapVue provides one of the most comprehensive implementations of Bootstrap 4 components and grid system for Vue.js and with extensive and automated WAI-ARIA accessibility markup.
29 lines (27 loc) • 1.16 kB
JavaScript
/*
* Consitant and stable sort function across JavsaScript platforms
*
* Inconsistant sorts can cause SSR problems between client and server
* such as in <b-table> if sortBy is applied to the data on server side render.
* Chrome and V8 native sorts are inconsistant/unstable
*
* This function uses native sort with fallback to index compare when the a and b
* compare returns 0
*
* Algorithm bsaed on:
* https://stackoverflow.com/questions/1427608/fast-stable-sorting-algorithm-implementation-in-javascript/45422645#45422645
*
* @param {array} array to sort
* @param {function} sortcompare function
* @return {array}
*/
export default function stableSort (array, compareFn) {
// Using `.bind(compareFn)` on the wrapped anonymous function improves
// performance by avoiding the function call setup. We don't use an arrow
// function here as it binds `this` to the `stableSort` context rather than
// the `compareFn` context, which wouldn't give us the performance increase.
return array
.map((a, index) => [ index, a ])
.sort(function (a, b) { return this(a[1], b[1]) || a[0] - b[0] }.bind(compareFn))
.map(e => e[1])
}