如何编写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
相关产品推荐
相关产品推荐

