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
相关产品推荐
相关产品推荐

