javascript数组排序核心是sort()的比较函数:数字排序用a-b升序、b-a降序;字符串忽略大小写用localecompare;多字段排序需逐级判断并返回明确数值。

JavaScript 数组排序的核心在于 sort() 方法的比较函数。它决定元素如何排列,不写比较函数时,默认按字符串 Unicode 编码排序,容易出错(比如 [10, 2, 30] 会排成 [10, 2, 30],因为 "10" 为真)。写对比较函数,才能实现真正符合预期的排序。
数值升序与降序
最常用也最容易掌握的写法:
- 升序:
(a, b) => a - b—— 返回负数时a在前,结果从小到大 - 降序:
(a, b) => b - a或(a, b) => -(a - b)—— 返回正数时b在前,结果从大到小
注意:这个逻辑只适用于数字类型。若数组含 null、undefined 或非数字字符串,减法可能返回 NaN,导致排序异常,需提前过滤或转换。
字符串忽略大小写排序
直接用 sort() 默认行为会把大写字母排在小写字母前面(因 'A' 的 Unicode 码点 65 小于 'a' 的 97)。安全做法是用 localeCompare:
-
(a, b) => a.localeCompare(b, 'en', { sensitivity: 'base' })—— 忽略大小写,按语言习惯排序 - 中文也支持:
'苹果'.localeCompare('香蕉')能正确按拼音顺序比较
避免手写 a.toLowerCase() ,它在遇到特殊字符(如带重音符号的字母)时可能不符合本地化预期。
对象数组按单属性排序
对用户列表、商品数据等常见场景,按某个字段排序:
- 按数字属性(如
age)升序:(a, b) => a.age - b.age - 按字符串属性(如
name)升序:(a, b) => a.name.localeCompare(b.name) - 支持空值容错:
(a, b) => (a.score ?? -Infinity) - (b.score ?? -Infinity),把null或undefined当作最小值排最前
多字段组合排序(如先按状态、再按时间)
返回值为 0 时才继续比下一个字段。利用“短路”逻辑:
-
(a, b) => { if (a.status !== b.status) return a.status.localeCompare(b.status); return new Date(b.date) - new Date(a.date); }—— 先按状态字母序升序,状态相同时按日期降序(最新在前) - 可封装复用:
sortBy(['status', 'date'], ['asc', 'desc'])这类工具函数本质也是展开成嵌套判断
关键点:每个比较分支必须明确返回负数、正数或 0;漏写 return 或返回 undefined 会导致排序结果不可预测。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











