使用方法
在线积分板的使用只有三步。第一步,在上方文本框里每行写一名选手,姓名和分数之间用空格或制表符隔开,例如「阿强 98」。第二步,按 Ctrl 或 Cmd 加 Enter,或点「计算排名」按钮,页面会立刻按分数从高到低排出名次。第三步,需要留存时点「导出 CSV」拿到带 BOM 的表格,点「导出 JSON」拿到结构化数据,或点「复制对照表」把制表符分隔的内容贴到 Excel。打开页面时文本框里已经放好一份 14 人的示例榜单,直接改名字和分数就能用,不必先想格式。
能解决什么
课堂小测、部门 KPI、棋牌赛、运动会、直播打榜都绕不开同一件事:一堆分数进来,人却很难立刻说出谁第一、谁和第几并列、每个人占了全场的多少。在线积分板把这件手工活自动化——它不只排序,还同时给出总分、最高分、平均分三个汇总,以及每个人的两项占比,让你一眼看清差距的分布,而不只是知道一个名次。当两个人同分时,它会按「奥林匹克排名」给相同名次并跳过后续序号,避免你拿计算器去核对。对于需要留痕的场合,CSV 与 JSON 两种导出让你直接进报表系统,不必重新敲一遍。
原理和变量
这一节回答技术内核的六个问题,只针对在线积分板本身。
① 调用什么算法:排序用 Array.prototype.sort 配合降序比较函数;名次用「竞争排名(Standard competition ranking)」的循环算法——遍历已排序数组,凡分数相等的连续若干行共用同一个名次,该名次等于它们在排序后第一次出现的位置序号,下一组名次直接取当前下标加一。这与稠密排名(dense,并列后不跳号)和分数排名(fractional,并列取平均分位)都不同。
② 参数为什么取这个值:占比同时给出「占总分」和「占最高分」两列,因为总分口径会受低分拖累、最高分口径更直观反映领先幅度,二者互补;平均分用 toFixed(2) 保留两位小数,是因为分数多为整数,两位小数足够表达小数赛制又不会露出处女座级别的抖动。
③ 遵循什么标准:名次规则采用维基定义的「Standard competition ranking」(又称 1224 排名),是体育计分最通用的口径;导出 CSV 带 UTF-8 BOM 遵循 Excel 打开中文表格不乱码的事实约定。
④ 输入怎么变成输出:每行先 trim 去空白,再 split(/\s+/) 按空白切分,末段 Number 转数字、其余拼回姓名;分数经 isFinite 校验后进入数组,按降序排序,随后跑名次循环得到 rank,最后 score / total * 100 与 score / max * 100 算出两列百分比。
⑤ 边界与阈值:选手数量限制在 1 到 100 名;单局分数允许 -99999 到 99999(负分用于扣分惩罚);当所有分数都为 0 时总分为 0,占比分母做保护直接显示 0.00% 而不是 NaN;分数内部走 IEEE 754 双精度,安全整数上限为 2 的 53 次方(9007199254740991),远超日常计分范围。
⑥ 常见误用:误以为并列后名次连续(实际按 1224 会跳号,例如两个第二之后直接是第四);误以为占比该用最高分做分母(那样冠军恒为 100%、掩盖了绝对差距);同分时没有稳定次序,本工具以「输入顺序」作为二次排序键,保证刷新结果一致。
完整示例
下面这份 14 人榜单就是页面打开时文本框里的示例,已按上述规则复算。总分为 740,最高分 98,平均分 52.86。注意小美与老王同为 87 并列第二,阿杰与丽丽同为 76 并列第四,因此榜单里没有第三、第五名,这就是 1224 排名的典型跳号。
| 名次 | 姓名 | 分数 | 占总分 | 占最高分 |
|---|---|---|---|---|
| 1 | 阿强 | 98 | 13.24% | 100.00% |
| 2 | 小美 | 87 | 11.76% | 88.78% |
| 2 | 老王 | 87 | 11.76% | 88.78% |
| 4 | 阿杰 | 76 | 10.27% | 77.55% |
| 4 | 丽丽 | 76 | 10.27% | 77.55% |
| 6 | 大锤 | 65 | 8.78% | 66.33% |
| 7 | 阿福 | 54 | 7.30% | 55.10% |
| 7 | 婷婷 | 54 | 7.30% | 55.10% |
| 9 | 小明 | 43 | 5.81% | 43.88% |
| 10 | 阿龙 | 32 | 4.32% | 32.65% |
| 10 | 静静 | 32 | 4.32% | 32.65% |
| 12 | 阿伟 | 21 | 2.84% | 21.43% |
| 13 | 小燕 | 10 | 1.35% | 10.20% |
| 14 | 阿牛 | 5 | 0.68% | 5.10% |
输入范围与对照表
在线积分板对输入的约束决定了它能接什么数据。下表把每个字段的允许范围、默认值与非法时的处理列清楚,方便你在上游系统里做校验。分数下限 -99999、上限 99999 覆盖了绝大多数计分场景;若你传入超出该范围的数值,工具会提示具体是哪一行越界,而不是静默归零。
| 项目 | 允许范围 | 默认 / 示例 | 越界处理 |
|---|---|---|---|
| 选手数量 | 1 ~ 100 名 | 示例 14 名 | 超过 100 提示删减 |
| 单行分数 | -99999 ~ 99999 | 87 | 超限提示具体行 |
| 姓名 | 非空文本 | 阿强 | 缺姓名则报错行号 |
| 分隔符 | 空格 / 制表符 | 一个空格 | 多个空白自动合并 |
| 总分 | 由分数求和 | 740 | 全 0 时占比显示 0 |
| 最高分 | 数组最大值 | 98 | 单人时也正常 |
| 平均分 | 总分 / 人数 | 52.86 | 保留两位小數 |
| 占比小数位 | 固定 2 位 | 13.24% | 四舍五入 |
| 名次口径 | 1224 竞争排名 | 并列跳号 | 同分稳定次序 |
| 负分 | 允许(扣分) | -20 | 照常参与排序 |
| 小数分数 | 允许 | 9.5 | 照常参与排序 |
| 空行 | 自动忽略 | — | 不计入人数 |
| 安全整数 | ≤ 2^53 | 远低于 | 日常不会触及 |
上表超过 12 行,点「加载更多」可展开剩余行;需要外发时直接用工具区的 CSV / JSON / 复制对照表。
边界与精度
计分最怕两种边界:全为零和只有一人。当 14 个人的分数全是 0 时,总分为 0,占比公式的分母就是 0,若不做保护会得到 NaN 或 Infinity;在线积分板在这里把占比强制显示为 0.00%,并在汇总区照常给出「总分 0、最高分 0、平均分 0.00」,让你知道数据是空场而不是算错。当只有一名选手时,他自然排第 1,占总分 100%、占最高分 100%,平均分等于他自己的分数。小数分数如 9.5 也照常参与排序与占比,只是平均分可能落到两位小数的中间值。
精度方面,所有运算基于 JavaScript 的 IEEE 754 双精度浮点。整数在 2 的 53 次方以内可精确表示,而计分板的实际数值(百人、十万分以内)远低于这条红线,因此名次与占比不会出现浮点误差导致的错位。百分比保留两位小数用四舍五入,与常见的财务展示一致。
常见问题
名次出现并列时怎么算,为什么有时跳号?
本工具用「竞争排名(1224)」:分数相同的所有人拿同一个名次,下一个名次直接取它们在排序里的位置序号。两个 87 分并列第二后,76 分那组就成第四,所以榜单没有第三名。这是奥运计分的通用口径,不是 bug。
占比到底用总分还是用最高分做分母?
两列都给。占总分反映一个人对全场的贡献,受低分拖累;占最高分更直观地显示他离冠军差多少。看排名分布用总分列,看领先幅度用最高分列,二者互补。
分数可以是负数吗?
可以。负分用于惩罚扣分等场景,例如「阿龙 -20」会照常参与排序与占比计算,只是拉低总分。但单局分数限制在 -99999 到 99999 之间。
最多能排多少名选手?
最多 100 名。超过 100 时工具会提示你删减后再算,避免一次性粘贴几千行把浏览器卡住。日常课堂与赛事远用不到上限。
同分的人谁排前面?
分数相等时,以你在文本框里的输入顺序作为二次排序键,先写的排前面。这样刷新页面结果一致,不会每次乱跳。
平均分为什么要保留两位小数?
分数多为整数,两位小数足以表达小数赛制(如体操 9.5)的差距,又不会暴露无意义的浮点小数。需要更高精度时可在导出 JSON 里看到原始数值。
导出 CSV 为什么要带 BOM?
Excel 打开不带 BOM 的 UTF-8 文件会把中文当成乱码。工具在 CSV 开头写入 UTF-8 BOM(EF BB BF),保证双击就能正常显示中文。JSON 导出则刻意不带 BOM,否则 JSON.parse 会报错。
刷新或关掉页面数据会丢吗?
会。在线积分板是纯前端工具,结果只存在于当前页面,不存储、不上传。重要的榜单请记得导出 CSV 或 JSON 留存。