如何使用合并排序方法编写数组排序polyfill

问题描述 投票:0回答:1

我试图用 JavaScript 编写一个用于数组排序的 Polyfill。然而事实证明,比较器不会对 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.log("sortedArr", sortedArr);

javascript arrays sorting merge polyfills
1个回答
0
投票

我们来看看:

  let newCompareFn = compareFn ? compareFn = (l, r) => l < r : newCompareFn;
  newCompareFn = (left, right) => left > right;

如果

compareFn
被传递给函数,第一行将对其进行 重新分配 。不过,这并不重要,因为下一行用另一个函数覆盖了对
newCompareFn
的第一个赋值。 (请注意,如果
compareFn
参数未传递,则 newCompareFn
 将被设置为 
undefined
。不过,这并不重要,因为它会在下一行中重新分配。)

如果您想使用作为参数传递的比较器函数,则无需执行任何类似的重新分配;只需使用该功能即可。

© www.soinside.com 2019 - 2024. All rights reserved.