我可能从坟墓中提出这个问题,但我认为全局比较方法可能对某些人有用(例如,我们没有对数字进行排序)。这是使用 ES6 的 TypeScript 版本:
TL;DR
type Comparator<T> = (itemA: T, itemB: T) => number;
const mergeSort = <T>(list: T[], compare: Comparator<T>): T[] => {
if (list.length <= 1) return list;
const middleIndex = Math.floor(list.length / 2);
const listA = mergeSort(list.slice(0, middleIndex), compare);
const listB = mergeSort(list.slice(middleIndex), compare);
return merge(listA, listB, compare);
};
const merge = <T>(listA: T[], listB: T[], compare: Comparator<T>): T[] => {
if (listA.length === 0) return listB;
if (listB.length === 0) return listA;
return compare(listA[0], listB[0]) <= 0
? [listA[0], ...merge(listA.slice(1), listB, compare)]
: [listB[0], ...merge(listA, listB.slice(1), compare)];
};
说明
我们现在可以将一个额外的compare 函数传递给mergeSort 函数。这个compare 函数的定义与JavaScript's Array.prototype.sort() 方法的参数中的定义相同。
例如,number 比较器将是:
const compareNumbers: Comparator<number> = (numberA, numberB) =>
numberA - numberB;
...User 对象比较器可能是:
const compareUsersByAge: Comparator<User> = (userA, userB) =>
userA.age - userB.age;
...如果需要,也可以进行更复杂的操作(例如字符串比较)。