Как написать полифил для сортировки массива, используя метод сортировки слиянием

Я пытался написать 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);

Похоже, у меня это работает. Какая у вас проблема?

Rory McCrossan 17.05.2024 11:05

Первые две строки в цикле while в merge() странные и почти наверняка неправильные. Что вы ожидаете от кода?

Pointy 17.05.2024 11:05

Я хочу заставить этот компаратор работать. Но не в силах этого сделать! @Pointy Я включил эти две строки, чтобы компаратор работал. Но он не работает. Поэтому попросили решение.

Subhojit 17.05.2024 11:14

Кроме того, возвращать компаратор просто true или false не очень хорошая идея, если вы хотите, чтобы ваш сорт давал надежные результаты. Следуйте шаблону встроенной сортировки и возвращайте отрицательное, положительное или ноль, чтобы указать результат упорядочивания.

Pointy 17.05.2024 11:28
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
4
70
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Давайте посмотрим на:

  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);

Другие вопросы по теме