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. 数字排序

升序

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

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

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

降序

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

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

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

2. 字符串排序

字母升序

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

names.sort();

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

忽略大小写

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

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

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

3. 对象数组排序

假设:

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

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

按年龄升序

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

结果:

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

按年龄降序

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

按名字排序

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

4. 多字段排序

先按年龄,再按名字:

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

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

例如:

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

排序后:

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

5. 日期排序

bash 复制代码
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() 会修改原数组:

bash 复制代码
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+ / 新浏览器):

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

面试常考点

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

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

结果:

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

因为实际上比较的是:

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

数字排序一定要写:

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

===================

Theoweb3

CSDN 用户 ID:wwh1st,GitHub:theoweb3,TG:theo_liu,X:theoweb33,谷歌邮箱:wwh9th,公众号:穗余

深耕 Web3 领域,为公链与分布式底层基础设施建设者,长期聚焦公链底层架构、链上基础设施、跨链协议、去中心化系统研发,持续落地基础设施相关技术实践与开源项目。

作为中文 Web3 领域内容创作者与行业 KOL,持续输出底层技术解析、生态研究、行业观察内容,面向开发者与从业者普及区块链底层逻辑,搭建技术沟通桥梁,拥有持续行业影响力。

华语 Web3 开源社区参与者与共建者,积极推动开源协作、开发者交流、技术落地实践,持续赋能华语开发者生态,推动开源方案在公链基础设施场景落地,拓展华语开源社区对外技术交流边界。

长期持续输出技术博客,记录公链底层开发、分布式系统、Web3 工程实践、开源项目落地经验,沉淀可复用技术方案,致力于用技术推动去中心化基础设施持续发展。

相关推荐
FYKJ_20101 天前
SSM校园失物招领系统41452-计算机课程设计、毕业设计
java·vue.js·spring boot·python·mysql·typescript·spark
tiankongdeyige2 天前
游戏战斗系统学习第2篇:有限状态机 (FSM)
学习·游戏·typescript
FYKJ_20102 天前
django电影推荐系统55066-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django
进击的明明2 天前
TypeScript速通笔记(下)
前端·面试·typescript
愛芳芳2 天前
element-plus+vite+vue3+pinpa+mock+typeScript搭建经典的电商管理后台
前端·javascript·typescript
miss2 天前
从零做一个可视化规则引擎:Vue3 递归条件树 + 双引擎结果对比
前端·vue.js·typescript
seowmt3 天前
结构化数据和自然语言描述哪个更管用?答案分场景
人工智能·google·typescript·go语言·schema
进击的明明3 天前
TypeScript速通笔记(上)
前端·面试·typescript
Orange_sparkle3 天前
langgraph快速入门
学习·ai·typescript·deepseek·claude code
FYKJ_20104 天前
springboot刑事案件管理系统03047-计算机课程设计、毕业设计
vue.js·spring boot·python·mysql·typescript·spark·django