如何实现考试分数列的正确数值排序(含N/A后置)
分数列排序问题修复方案
问题根源
你当前的排序逻辑直接拿百分比字符串做比较,这会触发字典序比较而非数值比较——比如'100%'和'20%',字符串比较时'1'的ASCII码小于'2',会被判定为'100%' < '20%',导致排序结果混乱。另外你把N/A转成空字符串,空字符串在字典序里会排在最前面,不符合N/A放最后的需求。
修正后的代码
合并重复逻辑,同时做数值转换和N/A优先级处理:
// Score Sort if (this.sortColumn === 'Score') { return [...data].sort((a, b) => { // 标记N/A为null,方便后续优先级判断 const scoreA = a.Score === 'N/A' ? null : parseFloat(a.Score.replace('%', '')); const scoreB = b.Score === 'N/A' ? null : parseFloat(b.Score.replace('%', '')); // 处理N/A:始终排在最后 if (scoreA === null && scoreB !== null) return 1; if (scoreA !== null && scoreB === null) return -1; if (scoreA === null && scoreB === null) return 0; // 根据排序方向做数值比较 if (scoreA > scoreB) { return this.scoreSort ? -1 : 1; // scoreSort为true时降序(100%在前),false时升序(0%在前) } else if (scoreA < scoreB) { return this.scoreSort ? 1 : -1; } return 0; }); }
代码说明
- 数值转换:通过
replace('%', '')去掉百分号,用parseFloat转成数值,确保按分数实际大小比较 - N/A处理:将N/A标记为
null,排序时优先让非N/A项前置,N/A统一排末尾 - 逻辑简化:合并原本重复的两个分支,直接用
this.scoreSort控制排序方向 - 原数组保护:用
[...data]创建浅拷贝,避免sort方法原地修改原数据
调整后可实现你需要的效果:
- 升序:
[0%, 10%, 20%, ..., 90%, 99%, 100%, N/A, N/A] - 降序:
[100%, 99%, 90%, ..., 20%, 10%, 0%, N/A, N/A]
内容的提问来源于stack exchange,提问作者Steven Encarnacion
相关产品推荐
相关产品推荐

