以下是我的JavaScript代码,用于以字母数字方式对数据进行排序:
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;
}
}
我的输入数据:
["ap1", "ap4", "ap12","4ggh2","7ggh9","9tggfg2","4gghdd2","4gghfg2"]
排序后的应该是:
4ggh2,4hghdd2,4kghfg2,7ggh9,9tggfg2,ap1,ap4,ap12
这没有发生,请你帮我解决一下。
function sortAlphaNum(a, b) {
var x = a.split("/");
var y = b.split("/");
x = x[x.length-1].replace(/\\\s/g," ").split(/(\d )/);
y = y[y.length-1].replace(/\\\s/g," ").split(/(\d )/);
for (var i in x) {
if (x[i] && !y[i] || isFinite(x[i]) && !isFinite(y[i])) {
return -1;
} else if (!x[i] && y[i] || !isFinite(y[i]) && isFinite(y[i])) {
return 1;
} else if (!isFinite(x[i]) && !isFinite(y[i])) {
x[i] = x[i].toLowerCase();
y[i] = y[i].toLowerCase();
if (x[i] < y[i]) return -1;
if (x[i] > y[i]) return 1;
} else {
x[i] = parseFloat(x[i]);
y[i] = parseFloat(y[i]);
if (x[i] < y[i]) return -1;
if (x[i] > y[i]) return 1;
}
}
return 0;
}
alert(["ap1", "ap4", "ap12","4ggh2","7ggh9","9tggfg2","4hghdd2","4kghfg2"].sort(sortAlphaNum));
答案 0 :(得分:1)
此示例向Array原型添加方法
但它可以作为独立函数编写,如果您愿意,可以将要排序的数组作为参数传递。
Array.prototype.naturalSort= function(index){
var T= this, L= T.length, i, who, next,
isi= typeof index== 'number',
rx=/(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.\D+)|(\.$)/g;
function nSort(aa, bb){
var a= aa[0], b= bb[0], a1, b1, i= 0, n, L= a.length;
while(i<L){
if(!b[i]) return 1;
a1= a[i];
b1= b[i++];
if(a1!== b1){
n= a1-b1;
if(!isNaN(n)) return n;
return a1>b1? 1:-1;
}
}
return b[i]? -1:0;
}
for(i= 0; i<L; i++){
who= T[i];
next= isi? T[i][index] || '':who;
T[i]= [String(next).toLowerCase().match(rx), who];
}
T.sort(nSort);
for(i= 0; i<L; i++){
T[i]= T[i][1];
}
return this;
}
var A= ["ap1","ap4","ap12","4ggh2","7ggh9","9tggfg2","4gghdd2","4gghfg2"];
A.naturalSort();
//返回值:(数组) // 4ggh2,4gghdd2,4gghfg2,7ggh9,9tggfg2,ap1,ap4,ap12
- 该示例首先遍历整个数组并将每个项目设置为新的两项数组 - 新数组的第一项是匹配的 数组和字符串数组,第二个是原始值。
醇>在你的例子中,array [5] ='9tggfg2'变为array [5] = [['9', 'tggfg','2'],'9tggfg2']]。那样reg exp,match和 toLowerCase操作只对每个项目执行一次,而不是 每次排序比较两个项目。
准备好数组后,将应用sort函数,如果它们都是alpha字符串,则按字母顺序比较项目 数字上,如果它们都是数字串。数字字符串排序 之前(小于)字母串。
- 醇>
排序后,再次处理数组,这次将每个项重置为原始值。
您可以在没有预排序和后排序部件的情况下使用相同的逻辑, 但是如果你有三个以上的项目需要更长的时间:
function natSort(as, bs){
var a, b, a1, b1, i= 0, n, L,
rx=/(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.\D+)|(\.$)/g;
a= String(as).toLowerCase().match(rx);
b= String(bs).toLowerCase().match(rx);
if(as=== bs) return 0;
L= a.length;
while(i<L){
if(!b[i]) return 1;
a1= a[i],
b1= b[i++];
if(a1!== b1){
n= a1-b1;
if(!isNaN(n)) return n;
return a1>b1? 1:-1;
}
}
return b[i]? -1:0;
}
["ap1", "ap4", "ap12", "4ggh2", "7ggh9",
"9tggfg2", "4gghdd2", "4gghfg2"].sort(natSort);
返回值:(数组) 的 4ggh2,4gghdd2,4gghfg2,7ggh9,9tggfg2,AP1,AP4,AP12 强>
答案 1 :(得分:0)
尝试:
var input = ["ap1", "ap4", "ap12","4ggh2","7ggh9","9tggfg2","4gghdd2","4gghfg2"];
input.sort();