如何实现含数字与特殊字符串的JS数组降序排序,非数字项置后
数组降序排序实现
实现思路
- 首先区分数字字符串和特殊字符串(
Calc、N/A),两类对比时特殊字符串始终排在末尾 - 数字字符串部分使用
localeCompare的数字比较模式,调换对比顺序实现降序 - 特殊字符串内部按
Calc在前、N/A在后的顺序排列,和升序结果尾部规则一致
降序代码实现
toSort.sort(function (a, b) { const specialSet = new Set(['Calc', 'N/A']); const aIsSpecial = specialSet.has(a); const bIsSpecial = specialSet.has(b); // 两个都是特殊字符串,按要求排序 if (aIsSpecial && bIsSpecial) { return a.localeCompare(b); } // 仅a是特殊字符串,a排后面 if (aIsSpecial) return 1; // 仅b是特殊字符串,b排后面 if (bIsSpecial) return -1; // 都是数字字符串,调换对比顺序实现降序 return b.localeCompare(a, undefined, { numeric: true }); }); console.log(toSort); // 输出:['100','52','43','30','16','12','11','10','8','2','Calc','Calc','N/A']
补充:优化后的升序代码(更稳定)
你原来的升序实现遇到特殊字符串和数字混合对比时依赖localeCompare默认行为,稳定性不足,可以参考上面的逻辑优化:
toSort.sort(function (a, b) { const specialSet = new Set(['Calc', 'N/A']); const aIsSpecial = specialSet.has(a); const bIsSpecial = specialSet.has(b); if (aIsSpecial && bIsSpecial) { return a.localeCompare(b); } if (aIsSpecial) return 1; if (bIsSpecial) return -1; return a.localeCompare(b, undefined, { numeric: true }); });
内容的提问来源于stack exchange,提问作者dush
相关产品推荐
相关产品推荐

