我使用这段代码,感谢这篇文章:
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a, b) {
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if (aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}
但是我尝试排序的内容有点复杂:
我有:
A1
A3
A5
A14
A6-1
A6-2
我期望 :
A1
A3
A5
A6-1
A6-2
A14
您可以将其分解为 3 个排序标准:1( 按第一个字符 2( 按第二个数字 3( 按可选的第三个数字(在破折号-
之后(:
const arr = ['A5','A3','A1','A14','A6-2','A6-1'];
const sorted = arr.sort((a,b) => {
const [[aChar, aN1, aN2],[bChar, bN1, bN2]] = [a,b].map(x => x.match(/([A-Z])|([0-9]+)/gi).map(el => Number(el) || el));
const c1 = aChar.localeCompare(bChar);
const c2 = aN1 - bN1;
const c3 = (aN2 || 0) - (bN2 || 0);
return c1 || c2 || c3;
});
console.log(sorted);
根据 https://stackoverflow.com/a/4340339/4225796 的参考,感谢 Pyrlia @Leonid 并根据您的问题,您已经参考了相同的内容,因此使用相同的示例作为参考,
我们可以通过 str.replace(/-.*/g, "( 删除 - 和之后的数字;
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
var removeDash = /-.*/g;
var arr = ['A5','A3','A1','A14','A6-2','A6-1'];
console.log(arr.sort(sortAlphaNum));
function sortAlphaNum(a, b) {
a= a.replace(removeDash, "");
b= b.replace(removeDash, "");
var aA = a.replace(reA, "");
var bA = b.replace(reA, "");
if (aA === bA) {
var aN = parseInt(a.replace(reN, ""), 10);
var bN = parseInt(b.replace(reN, ""), 10);
return aN === bN ? 0 : aN > bN ? 1 : -1;
} else {
return aA > bA ? 1 : -1;
}
}