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 工程实践、开源项目落地经验,沉淀可复用技术方案,致力于用技术推动去中心化基础设施持续发展。

相关推荐
DreamLife☼2 天前
Agent开发环境搭建完全指南
python·docker·typescript·node·工业知识点
码艺-Alimjan2 天前
Tauri 2.x + Vue 3 桌面应用开发实战:从踩坑到完美落地
前端·javascript·vue.js·rust·typescript·go
大模型丫丫3 天前
用 TypeScript、NestJS 和 LangGraph 搭建一个可控的 AI Agent
javascript·人工智能·typescript
shmily麻瓜小菜鸡3 天前
JavaScript / TypeScript 易踩坑知识点 —— 异步编程类
开发语言·javascript·typescript
妙码生花3 天前
使用git更新ai-go-admin框架
前端·人工智能·git·golang·typescript·php
晴天165 天前
Tsup:TypeScript库打包的“零配置极速方案”
前端·javascript·typescript
shmily麻瓜小菜鸡5 天前
JavaScript / TypeScript 易踩坑知识点 —— 作用域与变量类
开发语言·javascript·typescript