You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.2 KiB
32 lines
1.2 KiB
4 years ago
|
/*
|
||
|
* Consistent and stable sort function across JavaScript platforms
|
||
|
*
|
||
|
* Inconsistent 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 inconsistent/unstable
|
||
|
*
|
||
|
* This function uses native sort with fallback to index compare when the a and b
|
||
|
* compare returns 0
|
||
|
*
|
||
|
* Algorithm based on:
|
||
|
* https://stackoverflow.com/questions/1427608/fast-stable-sorting-algorithm-implementation-in-javascript/45422645#45422645
|
||
|
*
|
||
|
* @param {array} array to sort
|
||
|
* @param {function} sort compare function
|
||
|
* @return {array}
|
||
|
*/
|
||
|
var stableSort = 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(function (a, index) {
|
||
|
return [index, a];
|
||
|
}).sort(function (a, b) {
|
||
|
return this(a[1], b[1]) || a[0] - b[0];
|
||
|
}.bind(compareFn)).map(function (e) {
|
||
|
return e[1];
|
||
|
});
|
||
|
};
|
||
|
|
||
|
export default stableSort;
|