JavaScript如何实现含数字、字母后缀的字符串数组自定义排序
解决方案
你的排序需求可以拆解为3层优先级判断,我们可以先把每个字符串拆分为「数字前缀」和「后续字符后缀」两部分,再按规则排序:
- 优先比较数字前缀的数值大小,数值小的排前面
- 数值相同的情况下,比较后缀的字典序,空后缀排在有内容的后缀前面
- 数值和后缀都相同的情况下,字符串长度更短的排前面
实现代码如下:
const orig_array = ["2", "10", "01A", "1A", "02B", "1","03B"]; // 辅助拆分函数:拆分出数字前缀和后缀 const parseItem = (str) => { const match = str.match(/^(\d+)(.*)$/); return { num: Number(match[1]), suffix: match[2] } } // 先拷贝原数组再排序,避免修改原数组 const sorted_array = orig_array.slice().sort((a, b) => { const infoA = parseItem(a); const infoB = parseItem(b); // 先比数字大小 if (infoA.num !== infoB.num) { return infoA.num - infoB.num; } // 数字相同比后缀字典序 const suffixCmp = infoA.suffix.localeCompare(infoB.suffix); if (suffixCmp !== 0) { return suffixCmp; } // 都相同比长度,短的在前 return a.length - b.length; }); console.log(sorted_array); // 输出 ["1", "1A", "01A", "2", "02B", "03B", "10"]
原代码错误原因
你原来的代码直接用a - b做判断,当字符串包含非数字字符时(比如1A),a - b会返回NaN,条件判断失效,后续逻辑自然无法得到正确结果。
内容的提问来源于stack exchange,提问作者MSH
相关产品推荐
相关产品推荐

