You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript数组特殊排序求助:含大小写字母与数字的数组排序

解决JavaScript数组自定义排序问题

原始数组

let originalArray = ["Apple","apple","Acrobat","APPLE","Account","account","Banana","banana","carrot","Carrot",1,2,"BANANA","BB","AA"];

期望输出

sortedArray = ["AA","APPLE","Account","Acrobat","Apple","account","apple","BANANA","BB","Banana","banana","Carrot","carrot",1,2];

问题分析

你之前的代码存在两个核心问题:

  1. 错误使用a[keyname],数组元素是直接的字符串/数字,并非对象属性,无需额外属性访问;
  2. 未处理数字与字符串的排序优先级,导致数字可能混杂在字符串序列中。

解决方案

通过自定义排序函数实现以下规则:

  • 数字排在所有字符串之后,且按数值升序排列;
  • 字符串按英文字典序排序,大写形式优先于小写形式(如AA > APPLE > Account > account)。

完整代码

let originalArray = ["Apple","apple","Acrobat","APPLE","Account","account","Banana","banana","carrot","Carrot",1,2,"BANANA","BB","AA"];

// 创建原数组副本,避免修改原数组
let sortedArray = [...originalArray].sort((a, b) => {
  // 判断元素是否为数字
  const isANumber = typeof a === 'number';
  const isBNumber = typeof b === 'number';

  // 数字排最后:一个是数字一个是字符串时,数字靠后
  if (isANumber && !isBNumber) return 1;
  if (!isANumber && isBNumber) return -1;
  // 都是数字则按数值大小排序
  if (isANumber && isBNumber) return a - b;

  // 字符串排序:大写优先,按英文字典序
  return a.localeCompare(b, 'en', {
    caseFirst: 'upper', // 大写形式排在前面
    sensitivity: 'base' // 忽略大小写差异但保留大小写顺序
  });
});

console.log(sortedArray);

代码说明

  • 使用[...originalArray]复制原数组,避免直接修改原数组的引用;
  • 通过typeof判断元素类型,确保数字始终处于排序结果的末尾;
  • localeCompare的caseFirst: 'upper'参数保证大写字符串优先,sensitivity: 'base'确保同一字母的大小写视为同源字符,维持排序逻辑的一致性。

内容的提问来源于stack exchange,提问作者Chaitenya Rajurkar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 08:52:06