JavaScript数组自定义排序需用sort()配比较函数:数值排序用a-b或b-a;对象按属性排序需处理undefined/null;多级排序用逻辑短路;原地修改需拷贝数组,ES2019+支持稳定排序。

JavaScript 数组的自定义排序,核心是正确使用 Array.prototype.sort() 方法并传入一个比较函数。默认排序会把元素转成字符串再比较,所以数字数组直接调用 sort() 会出错(比如 [10, 2, 33] 排成 [10, 2, 33])。要实现真正按数值、对象字段、字符串长度甚至多条件排序,就得写好这个比较函数。
基础:数值升序与降序
比较函数接收两个参数 a 和 b,返回值决定顺序:
- 返回负数 →
a排在b前面 - 返回 0 →
a和b位置不变(相对顺序保留) - 返回正数 →
a排在b后面
升序写法:arr.sort((a, b) => a - b)
降序写法:arr.sort((a, b) => b - a)
按对象某个属性排序
比如有用户数组 users = [{name: 'Alice', age: 28}, {name: 'Bob', age: 22}],想按年龄升序:
users.sort((a, b) => a.age - b.age)
立即学习“Java免费学习笔记(深入)”;
按姓名字母序(忽略大小写):users.sort((a, b) => a.name.localeCompare(b.name))
注意:如果属性可能为 undefined 或 null,先做安全处理,例如:(a, b) => (a.name || '').localeCompare(b.name || '')
多级排序(先按A,再按B)
例如先按城市升序,城市相同时按年龄降序:
people.sort((a, b) => {
if (a.city !== b.city) return a.city.localeCompare(b.city);
return b.age - a.age;
});
更简洁写法(利用逻辑短路):people.sort((a, b) => a.city.localeCompare(b.city) || b.age - a.age)
说明:如果 localeCompare 返回 0(城市相同),就执行后面的减法;否则直接用字符串比较结果。
稳定排序与不可变处理
sort() 是原地修改数组。如需保留原数组,先拷贝:[...arr].sort(...) 或 arr.slice().sort(...)
ES2019+ 中 sort() 是稳定排序(相同值的相对顺序不变),但旧版某些引擎不保证。若需强稳定性(比如分页后合并排序),可添加唯一索引辅助:arr.map((item, i) => ({...item, _id: i})).sort(...).map(({_id, ...rest}) => rest)










