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

JavaScript实现字母优先的字母数字字符串排序问题

字母数字字符串自定义排序实现

现有代码

var List = ["F", "60", "59", "6", "7", "7'", "60'", "60a", "c1", "A", "5", "a1", "6.2", "A'", "B", "A1"];

var sortedListe = List.sort(function (a, b) {
  var collator = new Intl.Collator('en', { numeric: true, sensitivity: "base" });
  return collator.compare(a, b);
});

console.log(sortedListe);

当前执行结果

["5", "6", "6.2", "7", "7'", "59", "60", "60'", "60a", "A", "A'", "a1", "A1", "B", "c1", "F"]

现有排序的优缺点

  • 优点:
    • 6.2 排在 7 之前,符合数字逻辑
    • 7' 位置正确
    • c1 位于 B 和 F 之间,符合字母排序规则
  • 不足:以字母开头的字符串排在列表末尾,不符合需求

期望排序结果

["A", "A'", "a1", "A1", "B", "c1", "F", "5", "6", "6.2", "7", "7'", "59", "60", "60'", "60a"]

核心需求:字母开头的字符串优先排在数字开头的字符串之前,同时保留原有排序的优点。

修改后的代码实现

通过先判断字符串开头类型,让字母开头项优先;同类型项再沿用原有的智能排序规则,即可实现需求:

var List = ["F", "60", "59", "6", "7", "7'", "60'", "60a", "c1", "A", "5", "a1", "6.2", "A'", "B", "A1"];

var sortedListe = List.sort(function (a, b) {
  // 判断字符串是否以字母开头
  const isLetterA = /^[a-zA-Z]/.test(a);
  const isLetterB = /^[a-zA-Z]/.test(b);
  
  // 类型不同时,字母开头项排前面
  if (isLetterA && !isLetterB) return -1;
  if (!isLetterA && isLetterB) return 1;
  
  // 类型相同时,使用原有的数字、字母混合排序规则
  var collator = new Intl.Collator('en', { numeric: true, sensitivity: "base" });
  return collator.compare(a, b);
});

console.log(sortedListe);

验证结果

执行修改后的代码,输出结果与期望完全一致:

["A", "A'", "a1", "A1", "B", "c1", "F", "5", "6", "6.2", "7", "7'", "59", "60", "60'", "60a"]

内容的提问来源于stack exchange,提问作者Sarah Trees

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:22:43