raj*_*dav 8 javascript sorting jquery angularjs
我有一个混合数组,我需要按数字,字母,然后按数字排序 -
['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3']
Run Code Online (Sandbox Code Playgroud)
我如何将其排序为:
['1', '2', 'A1', 'A2', 'A3', 'A3A', 'A3B', 'A4', 'A10', 'A11', 'A12', 'B2', 'B10', 'F1', 'F3']
Run Code Online (Sandbox Code Playgroud)
这是我尝试过的:
var reA = /[^a-zA-Z]/g;
var reN = /[^0-9]/g;
function sortAlphaNum(a, b) {
var AInt = parseInt(a.Field, 10);
var BInt = parseInt(b.Field, 10);
if (isNaN(AInt) && isNaN(BInt)) {
var aA = (a.Field).replace(reA, "");
var bA = (b.Field).replace(reA, "");
if (aA === bA) {
var aN = parseInt((a.Field).replace(reN, ""), 10);
var bN = parseInt((b.Field).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;
}
}
fieldselecteddata.sort(sortAlphaNum);
Run Code Online (Sandbox Code Playgroud)
但是,只有按字母顺序排序,/数字,直到1个数字的组合和1个字符像A1,A2,A10.但是,如果会有像这样的值A3A,A3B那么它就不会正确排序.可以使用直接JavaScript或jQuery完成吗?
var arr = ['A1', 'A10', 'A11', 'A12', 'A3A', 'A3B', 'A3', 'A4', 'B10', 'B2', 'F1', '1', '2', 'F3'];
// regular expression to get the alphabetic and the number parts, if any
var regex = /^([a-z]*)(\d*)/i;
function sortFn(a, b) {
var _a = a.match(regex);
var _b = b.match(regex);
// if the alphabetic part of a is less than that of b => -1
if (_a[1] < _b[1]) return -1;
// if the alphabetic part of a is greater than that of b => 1
if (_a[1] > _b[1]) return 1;
// if the alphabetic parts are equal, check the number parts
var _n = parseInt(_a[2]) - parseInt(_b[2]);
if(_n == 0) // if the number parts are equal start a recursive test on the rest
return sortFn(a.substr(_a[0].length), b.substr(_b[0].length));
// else, just sort using the numbers parts
return _n;
}
console.log(arr.sort(sortFn));Run Code Online (Sandbox Code Playgroud)
注意:i正则表达式中的修饰符 ( /.../i) 表示不区分大小写(同时查找小写和大写)。