如何让数组排序时特定值'-'升序排末尾、降序排首位?
数组排序特殊值位置问题修复
问题描述
需要实现数组的升序/降序排序,要求特殊值-在升序排序时位于数组末尾,降序排序时位于数组首位。示例:
- 原数组:
["-", "a", "z", "-", "b"] - 升序预期结果:
["a", "b", "z", "-", "-"] - 降序预期结果:
["-", "-", "z", "b", "a"]
现有JavaScript代码运行后,-始终处于数组首位,无法满足需求。
问题排查
原代码中处理-的逻辑未结合ascending参数判断:
// 原错误逻辑 if (a === "-") { return -1; // 无论升序降序,a是-就会排在b前面 } if (b === "-") { return 1; // 无论升序降序,b是-就会排在a后面 }
这段逻辑固定让-排在所有元素前面,完全忽略了升序/降序的配置,导致不符合预期。
解决方案
修改-的判断逻辑,结合ascending参数动态调整返回值:
function alphabetically(ascending) { return function (a, b) { if (a === b) { return 0; } // 根据排序方向处理特殊值"-" if (a === "-") { // 升序时"-"排后面,返回1;降序时"-"排前面,返回-1 return ascending ? 1 : -1; } if (b === "-") { // 升序时让b("-")排后面,返回-1;降序时让b("-")排前面,返回1 return ascending ? -1 : 1; } // 普通字符排序逻辑 if (ascending) { return a < b ? -1 : 1; } return a < b ? 1 : -1; }; } var arr = ["-", "a", "z", "-", "b"]; console.log(arr.sort(alphabetically(true))); // 输出: ["a", "b", "z", "-", "-"] console.log(arr.sort(alphabetically(false))); // 输出: ["-", "-", "z", "b", "a"]
核心修改点
- 当
a是-时:升序返回1(让a排在b后面),降序返回-1(让a排在b前面) - 当
b是-时:升序返回-1(让a排在b前面),降序返回1(让b排在a前面)
这样就能完全符合需求中对-位置的要求。
内容的提问来源于stack exchange,提问作者Tales
相关产品推荐
相关产品推荐

