JS排序对象数组时如何跳过"Failed"项,排序后将其追加到末尾
实现方案
你现有代码仅完成了有效成绩项的过滤和排序,没有将标记为Failed的失败项追加回结果,可通过以下两种方式实现需求:
方案1:基于原有逻辑改造(逻辑直观)
拆分有效项和失败项,对有效项排序完成后直接拼接失败项到数组末尾,和你原有写法的兼容性最好:
const markSheet = [{ merit: 1 }, { merit: "Failed" }, { merit: 2 }]; const defineMerit = (markSheet) => { // 分别筛选有效成绩项、挂科项 const validList = markSheet.filter(item => item.merit !== "Failed"); const failedList = markSheet.filter(item => item.merit === "Failed"); // 有效项升序排序后拼接挂科项 return validList.sort((a, b) => a.merit - b.merit).concat(failedList); }; console.log(defineMerit(markSheet));
方案2:自定义排序规则(无需两次过滤)
直接在sort比较函数中定义优先级,将Failed项的排序权重设为最低,自动排到数组末尾,注意先浅拷贝原数组避免sort直接修改原数据:
const markSheet = [{ merit: 1 }, { merit: "Failed" }, { merit: 2 }]; const defineMerit = (markSheet) => { // 浅拷贝避免修改原数组 return [...markSheet].sort((a, b) => { // a是挂科项,排到b后面 if (a.merit === "Failed") return 1; // b是挂科项,a排到b前面 if (b.merit === "Failed") return -1; // 都是有效成绩时按merit数值升序排列 return a.merit - b.merit; }); }; console.log(defineMerit(markSheet));
两种方案运行后都会输出符合预期的结果:
[ { "merit": 1 }, { "merit": 2 }, { "merit": "Failed" } ]
内容的提问来源于stack exchange,提问作者Fathe
相关产品推荐
相关产品推荐

