JavaScript sort() 方法通过比较函数实现多字段复合排序,关键是在字段相等时链式比较下一字段,用 || 连接升序(localeCompare 或减法)与降序(反向减法或 localeCompare),支持封装通用 multiSort 函数,注意原地修改、空值校验及中文本地化排序。

JavaScript 中 sort() 方法本身只接受一个比较函数,但通过在比较函数中组合多个字段的判断逻辑,就能实现多字段复合排序(比如先按城市升序,再按年龄降序)。关键在于:当第一字段相等时,才继续比较第二字段,依此类推。
基础写法:链式比较逻辑
比较函数返回负数、0 或正数。要实现“主字段升序 → 次字段降序”,可这样写:
arr.sort((a, b) => {
// 第一优先级:city 升序
if (a.city b.city) return 1;
<p>// city 相等时,第二优先级:age 降序
if (a.age b.age) return -1;</p><p>return 0;
});</p>
更简洁的数值字段写法(推荐)
对数字字段,直接用减法;对字符串,用 localeCompare() 安全比较:
-
数字字段升序:
a.age - b.age -
数字字段降序:
b.age - a.age -
字符串升序:
a.name.localeCompare(b.name) -
字符串降序:
b.name.localeCompare(a.name)
组合起来就是:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
arr.sort((a, b) => a.city.localeCompare(b.city) || // 升序,相等则继续 b.age - a.age // 降序 );
注意:|| 是关键——前面结果为 0(即相等)时,才会执行后面的表达式。
支持任意字段和顺序的通用函数
可以封装一个复用函数,传入字段名和排序方向('asc' 或 'desc'):
function multiSort(arr, ...rules) {
return arr.sort((a, b) => {
for (let [key, order] of rules) {
let va = a[key], vb = b[key];
let result;
<pre class="brush:php;toolbar:false;"> if (typeof va === 'string') {
result = va.localeCompare(vb);
} else {
result = va - vb;
}
if (order === 'desc') result = -result;
if (result !== 0) return result;
}
return 0;}); }
// 使用示例 multiSort(data, ['city', 'asc'], ['age', 'desc'], ['name', 'asc']);
注意事项和常见坑
⚠️ 注意:
-
sort()会**原地修改数组**,如需保留原数组,请先[...arr].sort(...)或arr.slice().sort(...) - 字段值为
null或undefined时,localeCompare会报错,建议提前处理或加空值校验 - 浮点数、布尔值等类型参与减法比较前,最好显式转成数字(如
Number(a.score)) - 中文排序用
localeCompare('zh')更准确,例如:a.title.localeCompare(b.title, 'zh')
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










