3 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個贊
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;
}
}
console.log(
["A1", "A10", "A11", "A12", "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum)
)

TA貢獻(xiàn)1874條經(jīng)驗(yàn) 獲得超12個贊
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })`
用法:
const sortAlphaNum = (a, b) => a.localeCompare(b, 'en', { numeric: true })
console.log(['A1', 'A10', 'A11', 'A12', 'A2', 'A3', 'A4', 'B10', 'B2', 'F1', 'F12', 'F3'].sort(sortAlphaNum))
給出:
["A1", "A2", "A3", "A4", "A10", "A11", "A12", "B2", "B10", "F1", "F3", "F12"]
您可能必須將'en'參數(shù)更改為您的語言環(huán)境或以編程方式確定,但這適用于英語字符串。
同樣localeCompare也不受超級一致的支持,但是如果您使用babel進(jìn)行轉(zhuǎn)譯不會有問題

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個贊
我也遇到類似的情況,但是混合使用字母數(shù)字和數(shù)字,因此需要先對所有數(shù)字進(jìn)行排序,然后再對字母數(shù)字進(jìn)行排序,因此:
A10
1
5
A9
2
B3
A2
需要成為:
1
2
5
A2
A9
A10
B3
我能夠使用提供的算法并對它進(jìn)行更多修改以實(shí)現(xiàn)此目的:
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a,b) {
var AInt = parseInt(a, 10);
var BInt = parseInt(b, 10);
if(isNaN(AInt) && isNaN(BInt)){
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;
}
}else if(isNaN(AInt)){//A is not an Int
return 1;//to make alphanumeric sort first return -1 here
}else if(isNaN(BInt)){//B is not an Int
return -1;//to make alphanumeric sort first return 1 here
}else{
return AInt > BInt ? 1 : -1;
}
}
var newlist = ["A1", 1, "A10", "A11", "A12", 5, 3, 10, 2, "A2", "A3", "A4", "B10", "B2", "F1", "F12", "F3"].sort(sortAlphaNum);
添加回答
舉報