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

如何编写JavaScript函数正确排序含数字的设备型号名称?

解决iPhone型号字符串的自然排序问题

普通JavaScript字符串排序是按字符的ASCII码逐个比较,这会导致带多位数的iPhone型号(比如iPhone 11)排在iPhone 7、8这类型号后面——因为字符串比较时,"1"的ASCII码小于"7",只会识别数字的首位,而非完整数字。

要实现按完整数字排序,核心思路是提取型号中的主版本数字,转换成数值后再比较,同时处理同版本型号的排序逻辑。

完整实现代码

const list = ['iPhone 8 Plus', 'iPhone 8', 'iPhone 7 Plus', 'iPhone 7', 'iPhone 6S Plus', 'iPhone 6 16GB', 'iPhone 6', 'iPhone 13', 'iPhone 12 Pro Max', 'iPhone 12 Pro', 'iPhone 11'];

// 辅助函数:提取iPhone型号的主版本数字
const getVersionNumber = (model) => {
  // 匹配"iPhone "后的数字部分,兼容6S这类带后缀的型号(提取数字6)
  const matchResult = model.match(/iPhone (\d+)/);
  return matchResult ? parseInt(matchResult[1], 10) : 0;
};

// 自定义排序函数
list.sort((a, b) => {
  const versionA = getVersionNumber(a);
  const versionB = getVersionNumber(b);

  // 优先按版本号降序排列(新机型在前)
  if (versionA !== versionB) {
    return versionB - versionA;
  }

  // 版本号相同时,按字符串自然顺序排序(比如iPhone 8 排在 iPhone 8 Plus 前面)
  return a.localeCompare(b);
});

console.log(list);

代码逻辑说明

  • 提取版本号:通过正则表达式/iPhone (\d+)/匹配型号中的数字部分,转换成整数用于数值比较。
  • 版本号优先排序:先比较两个型号的版本号数值,大的排前面(实现降序)。
  • 同版本处理:如果型号版本号相同,用localeCompare进行自然字符串排序,保证同型号的不同后缀版本排列合理。

运行后输出的排序结果:

['iPhone 13', 'iPhone 12 Pro Max', 'iPhone 12 Pro', 'iPhone 11', 'iPhone 8', 'iPhone 8 Plus', 'iPhone 7', 'iPhone 7 Plus', 'iPhone 6', 'iPhone 6 16GB', 'iPhone 6S Plus']

如果需要调整同版本型号的排序顺序(比如让带Plus/Pro的型号排在前面),只需把同版本比较的代码改成return b.localeCompare(a)即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:57:27