使用 javascript 的 `tosorted()` 方法或 `sort()` 方法配合比较函数,可轻松实现用户数组按 xp 从高到低排序,既保持原数组不变,又获得有序新数组。
在实际开发中,我们常需对包含对象的数组按某一数值属性(如用户的经验值 xp)进行排序。JavaScript 提供了原生、高效的方式完成这一任务——关键在于正确使用比较函数。
Array.prototype.toSorted() 是 sort() 的安全替代方法:它返回新数组,不修改原数组,语义更清晰,且专为函数式编程设计:
const users = [
{ userid: 1, xp: 36 },
{ userid: 2, xp: 61 },
{ userid: 3, xp: 13 }
];
const sortedUsers = users.toSorted((a, b) => b.xp - a.xp);
console.log(sortedUsers);
// → [{ userid: 2, xp: 61 }, { userid: 1, xp: 36 }, { userid: 3, xp: 13 }]? 原理:b.xp - a.xp 实现降序排列(大值在前)。若要升序(XP 最低者在前),则改为 a.xp - b.xp。
若目标运行时不支持 toSorted(),可选择以下任一方式:
直接使用 sort()(注意:会修改原数组):
const sortedCopy = [...users].sort((a, b) => b.xp - a.xp); // 浅拷贝 + 排序
添加轻量级 polyfill(推荐):
// 全局补丁(仅当 toSorted 不存在时)
Array.prototype.toSorted = Array.prototype.toSorted ?? function(compareFn) {
return [...this].sort(compareFn);
};该 polyfill 完全兼容原生行为:不污染原数组,支持任意比较函数,并自动处理 undefined 比较逻辑。
(a, b) => b.xp - a.xp || a.userid - b.userid
掌握 toSorted() 不仅让排序更安全、可读性更强,也体现了现代 JavaScript 的不可变编程理念——在用户数据管理等敏感场景中尤为关键。