javascript排序算法怎样写_如何实现数组的自定义排序?

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

JavaScript 数组的自定义排序,核心是正确使用 Array.prototype.sort() 方法并传入一个比较函数。默认排序会把元素转成字符串再比较,所以数字数组直接调用 sort() 会出错(比如 [10, 2, 33] 排成 [10, 2, 33])。要实现真正按数值、对象字段、字符串长度甚至多条件排序,就得写好这个比较函数。

基础:数值升序与降序

比较函数接收两个参数 ab,返回值决定顺序:

  • 返回负数 → a 排在 b 前面
  • 返回 0 → ab 位置不变(相对顺序保留)
  • 返回正数 → 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)

按姓名字母序(忽略大小写):users.sort((a, b) => a.name.localeCompare(b.name))

注意:如果属性可能为 undefinednull,先做安全处理,例如:(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)