sort默认按字符串Unicode码点排序,数值数组需传入(a,b)=>a-b;对象数组按字段排序需提取值比较,多级排序可用||链式;sort原地修改且旧版引擎不保证稳定。

sort 方法默认按字符串排序,不是数值大小
直接调用 arr.sort() 会把数组元素先转成字符串,再按 Unicode 码点比较。比如 [10, 2, 33, 1] 排完变成 [1, 10, 2, 33],因为 "10" 为真。
要按数值升序排,必须传入比较函数:
const nums = [10, 2, 33, 1]; nums.sort((a, b) => a - b); // [1, 2, 10, 33]
这个函数返回值决定顺序:
- 返回负数 →
a排在b前面 - 返回 0 → 位置不变(相对顺序可能变化,不保证稳定)
- 返回正数 →
a排在b后面
对对象数组按某个字段排序
常见需求是按对象的属性排序,比如按 name 字母序或按 age 数值大小。关键点是:提取字段值后再比较。
立即学习“Java免费学习笔记(深入)”;
按字符串字段升序(忽略大小写):
const users = [{name: 'Alice'}, {name: 'bob'}, {name: 'Charlie'}];
users.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));按数字字段降序(如 score):
const scores = [{name: 'A', score: 85}, {name: 'B', score: 92}];
scores.sort((a, b) => b.score - a.score); // 从高到低注意:localeCompare 比直接用 更可靠,能正确处理中文、重音字符等。
多级排序(先按 A,再按 B)
当主字段相同时,需回退到次字段。不能简单链式调用 sort,得在一个比较函数里嵌套判断。
例如:先按 category 升序,同 category 再按 price 降序:
items.sort((a, b) => {
if (a.category < b.category) return -1;
if (a.category > b.category) return 1;
return b.price - a.price; // price 降序
});更简洁写法(利用短路):
items.sort((a, b) => a.category.localeCompare(b.category) || b.price - a.price );
|| 左边为 0(相等)时才执行右边,天然支持多级。
sort 是原地修改,且不总是稳定
Array.prototype.sort() 直接修改原数组,不会返回新数组。如果需要保留原数组,得先拷贝:
[...arr].sort(...)arr.slice().sort(...)-
structuredClone(arr).sort(...)(深拷贝,ES2022+)
稳定性指:相等元素的相对位置是否保持。ECMAScript 规范不保证 sort 稳定,尤其在 V8(Chrome/Node)旧版本中,Array.prototype.sort 对相等项可能打乱顺序。如果业务依赖稳定性(比如分页后合并排序),要么升级到现代引擎(V8 7.0+ 默认稳定),要么手动加索引保序。











