数组sort()默认按Unicode码点排序,数字等需自定义比较函数;返回负数、正数或0决定a与b顺序;多级优先级需逐层判断;复杂场景可用加权得分预处理;注意稳定性与无副作用。

数组 sort() 的默认排序是按字符串 Unicode 码点升序,不适用于数字、对象或含业务规则的排序。要实现真正符合业务需求的优先级排序,关键在于写好自定义比较函数——它决定两个元素谁排在前、谁排在后。
理解比较函数的返回值逻辑
比较函数接收两个参数(通常叫 a 和 b),必须返回一个数字:
- 返回 负数(如
-1)→a排在b前面 - 返回 正数(如
1)→a排在b后面 - 返回 0 →
a和b相对位置不变(稳定排序中保持原有顺序)
⚠️ 注意:不要直接返回布尔值(如 a > b),这会导致错误排序(因为 true 转为 1,false 转为 0,缺少负数分支)。
多级优先级:从高到低逐层判断
真实业务常有复合规则,比如“未读消息优先,同为未读则按时间倒序,同为已读则按标题字母升序”。这时比较函数应按优先级顺序嵌套判断:
items.sort((a, b) => {
// 第一优先级:是否已读
if (a.read !== b.read) {
return a.read ? 1 : -1; // 未读(false)排前面
}
// 第二优先级:时间(新消息在前)
if (a.timestamp !== b.timestamp) {
return b.timestamp - a.timestamp; // 降序
}
// 第三优先级:标题(升序)
return a.title.localeCompare(b.title);
});
用数值权重统一处理复杂优先级
当规则较多、逻辑交织(如状态 + 紧急程度 + 创建人角色),可为每个元素预计算一个“综合得分”,再按得分排序,更清晰易维护:
- 给每类优先级分配权重(如状态×1000、紧急程度×100、角色×10)
- 将业务字段映射为可比数字(如
{high: 3, medium: 2, low: 1}) - 避免在
sort()中重复计算,建议先用map()预处理
示例:
const priorityMap = { urgent: 3, normal: 2, low: 1 };
const roleScore = { admin: 10, editor: 5, viewer: 1 };
<p>const scored = items.map(item => ({
...item,
score: priorityMap[item.priority] <em> 1000 +
roleScore[item.ownerRole] </em> 100 +
(item.isPinned ? 10000 : 0)
}));</p><p>scored.sort((a, b) => b.score - a.score); // 降序:分数高者优先</p>
注意稳定性与副作用
ES2019 起,Array.prototype.sort() 在大多数引擎中已是稳定排序(相同优先级的元素保持原始顺序),但仍有例外。若需强保障:
- 在比较函数中加入原始索引作为最终判据(如
a.__originalIndex - b.__originalIndex) - 避免在比较函数中修改原数组或外部变量(无副作用)
- 对大型数组,预计算得分比多次调用复杂逻辑更高效
业务排序不是比大小,而是表达“谁更重要”。把优先级拆解成可比维度,用返回值明确传递意图,sort() 就成了你业务规则的自然延伸。










