Я пытался написать Polyfill для сортировки массивов в JavaScript. Однако оказывается, что компаратор не оказывает никакого влияния на Polyfill. Есть идеи, как заставить это работать?
const arrA = [2, 3, 4, 1, 2, 3, 1, 5, 6, 8, 5, 9, 3];
const newArr = [...new Set(arrA)];
Array.prototype.myNewSort = function(compareFn) {
return mergeSort(this);
function mergeSort(arr) {
if (arr.length <= 1)
return arr;
const mid = Math.floor(arr.length / 2);
const leftArr = arr.slice(0, mid);
const rightArr = arr.slice(mid);
return merge(mergeSort(leftArr), mergeSort(rightArr));
}
function merge(left, right) {
let newArr = [];
while (left.length > 0 && right.length > 0) {
let newCompareFn = compareFn ? compareFn = (l, r) => l < r : newCompareFn;
newCompareFn = (left, right) => left > right;
if (newCompareFn(left[0], right[0])) {
newArr.push(left.shift());
} else {
newArr.push(right.shift())
}
}
return [...newArr, ...left, ...right];
}
function composeCompareFn(compareResult) {
if (Math.sign(compareResult) === -1) return false;
if (Math.sign(compareResult) === 1) return true;
if (compareResult === 0) return false;
}
}
const sortedArr = newArr.myNewSort((a, b) => a - b);
console.info("sortedArr", sortedArr);Первые две строки в цикле while в merge() странные и почти наверняка неправильные. Что вы ожидаете от кода?
Я хочу заставить этот компаратор работать. Но не в силах этого сделать! @Pointy Я включил эти две строки, чтобы компаратор работал. Но он не работает. Поэтому попросили решение.
Кроме того, возвращать компаратор просто true или false не очень хорошая идея, если вы хотите, чтобы ваш сорт давал надежные результаты. Следуйте шаблону встроенной сортировки и возвращайте отрицательное, положительное или ноль, чтобы указать результат упорядочивания.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Давайте посмотрим на:
let newCompareFn = compareFn ? compareFn = (l, r) => l < r : newCompareFn;
newCompareFn = (left, right) => left > right;
Если функции был передан compareFn, первая строка переназначит его. Однако это не имеет значения, поскольку следующая строка переопределяет первое присвоение newCompareFn еще одной функцией. (Обратите внимание, что если параметр compareFn не передан, newCompareFn будет установлен в undefined. Однако опять же, это не имеет значения, поскольку оно переназначается в следующей строке.)
Если вы хотите использовать функцию сравнения, переданную в качестве параметра, нет необходимости выполнять подобные переназначения; просто используйте функцию.
Обновленный код:
const arrA = [2,3,4,1,2,3,1,5,6,8,5,9,3];
const newArr = [...new Set(arrA)];
console.info("new arr", newArr);
Array.prototype.myNewSort = function(compareFn) {
return mergeSort(this);
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const leftArr = arr.slice(0, mid);
const rightArr = arr.slice(mid);
return merge(mergeSort(leftArr), mergeSort(rightArr));
}
function merge(left, right) {
let newArr = [];
while(left.length > 0 && right.length > 0) {
if (composeCompareFn(compareFn(right[0], left[0]))) {
newArr.push(left.shift());
} else {
newArr.push(right.shift())
}
}
return [...newArr, ...left, ...right];
}
function composeCompareFn(compareResult) {
if (Math.sign(compareResult) === -1) return false;
if (Math.sign(compareResult) === 1) return true;
if (compareResult === 0) return false;
}
}
const sortedArr = newArr.myNewSort((a, b) => b - a);
console.info("sortedArr", sortedArr);
Похоже, у меня это работает. Какая у вас проблема?