Typescript关于sort需要注意的地方

TypeScript(继承自 JavaScript)数组 sort() 方法的默认排序规则是:‌将所有元素转换为字符串,然后按 UTF-16 码元值(Unicode Code Point)升序排列‌。‌‌

这意味着:

  • 非数值排序 ‌:数字会被先转为字符串再比较。例如 [10, 2].sort() 结果是 [10, 2],因为字符串 "10" 的首字符 "1" 小于 "2"
  • 区分大小写 ‌:大写字母的 Unicode 值小于小写字母,因此 "Z" 会排在 "a" 前面。
  • 原地修改‌:该方法会直接改变原数组,并返回该数组的引用。

若需按数值大小或其他逻辑排序,必须传入‌比较函数 ‌,例如数字升序使用 (a, b) => a - b。‌‌

TypeScript 的 sort() 本质上和 JavaScript 一样,用于原地排序数组

1. 数字排序

升序

复制代码
const nums = [5, 2, 8, 1, 9];

nums.sort((a, b) => a - b);

console.log(nums);
// [1, 2, 5, 8, 9]

降序

复制代码
const nums = [5, 2, 8, 1, 9];

nums.sort((a, b) => b - a);

console.log(nums);
// [9, 8, 5, 2, 1]

2. 字符串排序

字母升序

复制代码
const names = ["Tom", "Alice", "Bob"];

names.sort();

console.log(names);
// ["Alice", "Bob", "Tom"]

忽略大小写

复制代码
const names = ["tom", "Alice", "bob"];

names.sort((a, b) =>
  a.toLowerCase().localeCompare(b.toLowerCase())
);

console.log(names);
// ["Alice", "bob", "tom"]

3. 对象数组排序

假设:

复制代码
interface User {
  name: string;
  age: number;
}

const users: User[] = [
  { name: "Tom", age: 25 },
  { name: "Alice", age: 18 },
  { name: "Bob", age: 30 },
];

按年龄升序

复制代码
users.sort((a, b) => a.age - b.age);

结果:

复制代码
[
  { name: "Alice", age: 18 },
  { name: "Tom", age: 25 },
  { name: "Bob", age: 30 },
]

按年龄降序

复制代码
users.sort((a, b) => b.age - a.age);

按名字排序

复制代码
users.sort((a, b) =>
  a.name.localeCompare(b.name)
);

4. 多字段排序

先按年龄,再按名字:

复制代码
users.sort((a, b) => {
  if (a.age !== b.age) {
    return a.age - b.age;
  }

  return a.name.localeCompare(b.name);
});

例如:

复制代码
[
  { name: "Tom", age: 20 },
  { name: "Alice", age: 20 },
  { name: "Bob", age: 18 },
]

排序后:

复制代码
[
  { name: "Bob", age: 18 },
  { name: "Alice", age: 20 },
  { name: "Tom", age: 20 },
]

5. 日期排序

复制代码
interface Order {
  id: number;
  createdAt: string;
}

const orders: Order[] = [
  { id: 1, createdAt: "2026-06-01" },
  { id: 2, createdAt: "2026-05-01" },
  { id: 3, createdAt: "2026-07-01" },
];

orders.sort(
  (a, b) =>
    new Date(a.createdAt).getTime() -
    new Date(b.createdAt).getTime()
);

6. 不修改原数组

sort() 会修改原数组:

复制代码
const arr = [3, 1, 2];

const sorted = [...arr].sort((a, b) => a - b);

console.log(arr);    // [3,1,2]
console.log(sorted); // [1,2,3]

或者现代写法(Node.js 20+ / 新浏览器):

复制代码
const sorted = arr.toSorted((a, b) => a - b);

面试常考点

默认排序是按字符串比较:

复制代码
[1, 10, 2].sort();

结果:

复制代码
[1, 10, 2]

因为实际上比较的是:

复制代码
["1", "10", "2"]

数字排序一定要写:

复制代码
arr.sort((a, b) => a - b);