数组对象排序功能失效求助:等级数据数组排序异常
解决数组对象按等级排序失效的问题
这个问题我之前也碰到过!核心原因是JavaScript默认的Array.sort()会把元素转为字符串后按UTF-16码点排序,完全不考虑你这些等级的实际优先级(比如"A++"明明是最高等级,但默认排序会把它排在"A"、"A+"之后)。下面给你两种靠谱的解决方案:
方案一:基于分数范围排序(最推荐)
你的数组里已经有gradeMinMarks和gradeMaxMarks这些实际分数字段,直接用数值排序是最准确、最省心的方式,就算以后新增等级也不用改排序逻辑:
const grades = [ { gradeName: "A+", gradeMaxMarks: "89", gradeMinMarks: "80" }, { gradeName: "A", gradeMaxMarks: "79", gradeMinMarks: "70" }, { gradeName: "B+", gradeMaxMarks: "69", gradeMinMarks: "60" }, { gradeName: "B", gradeMaxMarks: "59", gradeMinMarks: "55" }, { gradeName: "C", gradeMaxMarks: "49", gradeMinMarks: "40" }, { gradeName: "D", gradeMaxMarks: "39", gradeMinMarks: "30" }, { gradeName: "A++", gradeMaxMarks: "100", gradeMinMarks: "90" } ]; // 按最低分数降序排序(分数越高,等级越靠前) const sortedGrades = grades.sort((a, b) => { // 把字符串分数转为整数 const minScoreA = parseInt(a.gradeMinMarks, 10); const minScoreB = parseInt(b.gradeMinMarks, 10); // 降序排序用 b - a,升序则用 a - b return minScoreB - minScoreA; }); console.log(sortedGrades);
运行后会得到正确的顺序:A++ → A+ → A → B+ → B → C → D
方案二:自定义等级优先级映射
如果必须严格按gradeName的逻辑排序,你可以先定义一个优先级映射表,再根据映射值排序:
const grades = [ { gradeName: "A+", gradeMaxMarks: "89", gradeMinMarks: "80" }, { gradeName: "A", gradeMaxMarks: "79", gradeMinMarks: "70" }, { gradeName: "B+", gradeMaxMarks: "69", gradeMinMarks: "60" }, { gradeName: "B", gradeMaxMarks: "59", gradeMinMarks: "55" }, { gradeName: "C", gradeMaxMarks: "49", gradeMinMarks: "40" }, { gradeName: "D", gradeMaxMarks: "39", gradeMinMarks: "30" }, { gradeName: "A++", gradeMaxMarks: "100", gradeMinMarks: "90" } ]; // 定义等级优先级:数值越大,等级越高 const gradePriority = { "A++": 7, "A+": 6, "A": 5, "B+": 4, "B": 3, "C": 2, "D": 1 }; const sortedGrades = grades.sort((a, b) => { return gradePriority[b.gradeName] - gradePriority[a.gradeName]; }); console.log(sortedGrades);
这种方法需要维护gradePriority对象,以后新增等级时要记得更新这个映射表。
内容的提问来源于stack exchange,提问作者Sharath kumar
相关产品推荐
相关产品推荐

