如何按经验值(XP)降序排序用户数组

本文介绍如何使用 javascript 的 `tosorted()` 方法对包含用户对象的数组按 xp 值进行高效、安全的降序排序,并兼容旧版运行环境。

在开发排行榜、积分墙或用户动态列表时,常需将用户按经验值(XP)从高到低排序。给定如下用户数组:

const array = [
  { userid: 1, xp: 36 },
  { userid: 2, xp: 61 },
  { userid: 3, xp: 13 }
];

推荐使用 Array.prototype.toSorted() —— 这是 ES2025 引入的纯函数式方法,它不会修改原数组,而是返回一个新排序数组,语义清晰且更安全:

const sorted = array.toSorted((a, b) => b.xp - a.xp);
console.log(sorted);
// → [{ userid: 2, xp: 61 }, { userid: 1, xp: 36 }, { userid: 3, xp: 13 }]

✅ 排序逻辑说明:b.xp - a.xp 实现降序排列(最大 XP 在前);若需升序,改为 a.xp - b.xp 即可。

⚠️ 兼容性注意:toSorted() 在 Node.js 20+ 和现代浏览器(Chrome 117+, Firefox 119+, Safari 17.4+)中已原生支持。若需支持旧环境(如 Node.js

方案一:使用 sort() + 展开运算符(推荐)

const sorted = [...array].sort((a, b) => b.xp - a.xp);

方案二:轻量级 polyfill(全局补充)

// 仅在缺失时定义,避免覆盖原生实现
if (!Array.prototype.toSorted) {
  Array.prototype.toSorted = function(compareFn) {
    return [...this].sort(compareFn);
  };
}

? 补充提示:

  • sort() 默认按字符串 Unicode 排序,因此必须传入比较函数处理数字属性(如 xp),否则 61 可能排在 13 之前(因 '6' > '1')。
  • 若 xp 字段可能为 undefined 或非数字,建议增强健壮性:
    (a, b) => (b.xp ?? -Infinity) - (a.xp ?? -Infinity)

掌握 toSorted() 不仅提升代码可读性与安全性,也体现了现代 JavaScript 的函数式编程实践——始终优先选择不产生副作用的方法。