JavaScript含'-'字符数组排序:数字降序后接所有特殊字符
解决混合数字与'-'字符数组的排序问题
看起来你想要把包含数字和'-'的数组按「数字降序在前,所有'-'在后」的规则排序,你的思路是拆分数组再合并,但代码里有几个小问题导致没成功,我来帮你修正并给出更简洁的方案。
首先,先明确你的核心需求:原数组是var arr = [5, 3, 10, "-", 2, "-"],期望结果是[10, 5, 3, 2, "-", "-"]。
你的代码存在的问题
- 错误引用
element.name:你的数组元素是原始的数字/字符串,不是带name属性的对象,所以element.name会返回undefined,完全起不到过滤作用。 - 变量名不匹配:你定义的原数组是
arr,但过滤时用了arr_obj,这会导致ReferenceError。 - 排序函数未完成:你的排序逻辑只写了一半,而且同样错误地用了
element.name,正确的排序应该直接比较数字本身。
方案一:拆分+排序+合并(直观易懂)
这个思路和你最初的想法一致,修正错误后就能正常工作:
var arr = [5, 3, 10, "-", 2, "-"]; // 拆分出所有数字元素 const numberArr = arr.filter(element => typeof element === 'number'); // 拆分出所有'-'元素 const dashArr = arr.filter(element => element === '-'); // 对数字数组进行降序排序 numberArr.sort((a, b) => b - a); // 合并两个数组:数字在前,'-'在后 const finalResult = [...numberArr, ...dashArr]; console.log(finalResult); // 输出: [10, 5, 3, 2, "-", "-"]
方案二:单排序函数搞定(更高效)
如果你不想拆分数组,可以直接在sort函数里处理比较逻辑,一次完成排序:
var arr = [5, 3, 10, "-", 2, "-"]; arr.sort((a, b) => { // 如果a是'-',b是数字,把a放到后面 if (a === '-') return 1; // 如果b是'-',a是数字,把b放到后面 if (b === '-') return -1; // 都是数字,按降序排列 return b - a; }); console.log(arr); // 输出: [10, 5, 3, 2, "-", "-"]
这个方案的逻辑很清晰:
- 当其中一个元素是'-'时,让'-'始终排在数字后面;
- 当两个都是数字时,用
b - a实现降序排列。
内容的提问来源于stack exchange,提问作者Abhishek Agarwal
相关产品推荐
相关产品推荐

