我正在嘗試創建自己的排序函式(問題Async version of sort function in JavaScript)。我從Rosetta Code中獲取了合并排序功能并使其異步:
// based on: https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#JavaScript
async function mergeSort(fn, array) {
if (array.length <= 1) {
return array;
}
const mid = Math.floor(array.length / 2),
left = array.slice(0, mid), right = array.slice(mid);
await mergeSort(fn, left)
await mergeSort(fn, right)
let ia = 0, il = 0, ir = 0;
while (il < left.length && ir < right.length) {
array[ia ] = (await fn(left[il], right[ir]) <= 0) ? left[il ] : right[ir ];
}
while (il < left.length) {
array[ia ] = left[il ];
}
while (ir < right.length) {
array[ia ] = right[ir ];
}
return array;
}
但我不確定如何定義默認函式 fn 以使其與 JavaScript 中的作業方式相同。
console.log([1, 2, 3, 10, 11, 100, 20].sort());
與 JavaScript 引擎中的排序函式匹配的默認排序函式應該是什么?我應該將數字轉換為字串并進行比較嗎?什么是正確的實施?
uj5u.com熱心網友回復:
更新的答案
core.js 中定義的默認sort方法如下所示
var getSortCompare = function (comparefn) {
return function (x, y) {
if (y === undefined) return -1;
if (x === undefined) return 1;
if (comparefn !== undefined) return comparefn(x, y) || 0;
return toString(x) > toString(y) ? 1 : -1;
};
取自這個倉庫:https ://github.com/zloirock/core-js/blob/master/packages/core-js/modules/es.array.sort.js
uj5u.com熱心網友回復:
基于@jonrsharpe 評論,我能夠實作正確的默認功能:
function defaultSortFn(a, b) {
if (typeof a !== 'string') {
a = String(a);
}
if (typeof b !== 'string') {
b = String(b);
}
if (a < b) {
return -1;
}
if (a > b) {
return 1;
}
return 0;
}
可以用于我的排序:
Array.prototype.sort = function(fn = defaultSortFn) {
return mergeSort(fn, this);
};
uj5u.com熱心網友回復:
Arra.prototype.sort的 ECMAScript 規范提到比較(在沒有比較器的情況下)涉及:
e. 讓xString是 ? ToString( x )。
F。讓yString是 ? ToString( y )。
G。讓xSmaller成為!IsLessThan( xString , yString , true )。
H。如果xSmaller為真,則回傳-1 ??。
一世。讓y變小!IsLessThan( yString , xString , true )。
j. 如果ySmaller為真,則回傳1 ??。
?。回傳 0 ??。
考慮到 IsLessThan 程序也會在兩個字串與<運算子進行比較時執行,我們可以忠實地復制默認的回呼函式,如下所示:
function (x, y) {
let xString = String(x);
let yString = String(y);
return xString < yString ? -1 : yString < xString ? 1 : 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/482229.html
標籤:javascript 数组 排序
下一篇:按xy坐標排序
