数字功放和排序数组;按字母顺序排列的元素(自然排序) [英] Sort Array of numeric & alphabetical elements (Natural Sort)
本文介绍了数字功放和排序数组;按字母顺序排列的元素(自然排序)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有一个数组
VAR ARR = [1,5,ahsldk,10,55,3,2,7,8,1,2,75,ABC,的HUD] ;
和我尝试整理它,我得到的东西像...
[1,1,10,2,2,3,5,55,7,75,8,ABC,ahsldk,的HUD]
通知10 2前,我怎么能有更多的东西一样。
[1,1,2,2,3,5 ......,ABC,AHS ...,...]
解决方案
HTTP: //snipplr.com/view/36012/javascript-natural-sort/ 通过mrhoo:
Array.prototype.naturalSort =功能(){
变种的a,b,A1,B1,RX = /(\\ D +)|(\\ D +)/克,RD = / \\ D + /;
返回this.sort(功能(如,BS){
一个=字符串(如).toLowerCase()的比赛(RX)。
B =字符串(BS).toLowerCase()的比赛(RX)。
而(则为a.length&安培;&安培; b.length个){
A1 = a.shift();
B1 = b.shift();
如果(rd.test(A1)|| rd.test(B1)){
如果(rd.test(A1)!)返回1;
如果(rd.test(B1)!)返回-1;
IF(A1 = B1!)返回A1-B1;
}
否则,如果(!A1 = B1)返回A1> B1? 1:-1;
}
返回a.length- b.length个;
});
}
或者,从Alphanum:<一href=\"http://web.archive.org/web/20130826203933/http://my.opera.com/GreyWyvern/blog/show.dml/1671288\"相对=nofollow>的Javascript自然排序算法由布赖恩·豪氏威马:
Array.prototype.alphanumSort =功能(CASEINSENSITIVE){
对于(VAR Z = 0,T; T =本[Z]; Z ++){
这个[Z] = [];
变种X = 0,Y = -1,n = 0的,I,J; 而(I =(J = t.charAt(X ++))。CHAR $ C $猫(0)){
变种M =(我== || 46(I&GT; = 48安培;&安培; I&LT; = 57));
如果(M!== N){
这个[Z] [++ Y] =;
N = M;
}
这个[Z] [Y] + = j的;
}
} this.sort(功能(A,B){
为(变量X = 0,AA,BB(AA =一[X])及及(BB = B [X]); X ++){
如果(CASEINSENSITIVE){
AA = aa.toLowerCase();
BB = bb.toLowerCase();
}
如果(AA!== BB){
变种C =号(AA),D =号(BB);
如果(C == AA&放大器;和D == BB){
回复C - D组;
}否则返回(AA&GT; BB)? 1:-1;
}
}
返回则为a.length - b.length个;
}); 对于(VAR Z = 0; z,其中,this.length; Z ++)
这个[Z] =本[Z]。加入();
}
Suppose I have an array
var arr = [1,5,"ahsldk",10,55,3,2,7,8,1,2,75,"abc","huds"];
and I try sorting it, I get something like ...
[1, 1, 10, 2, 2, 3, 5, 55, 7, 75, 8, "abc", "ahsldk", "huds"]
notice 10 is before 2, how can I have something more like
[1,1,2,2,3,5 ..., "abc", "ahs...",...]
解决方案
From http://snipplr.com/view/36012/javascript-natural-sort/ by mrhoo:
Array.prototype.naturalSort= function(){
var a, b, a1, b1, rx=/(\d+)|(\D+)/g, rd=/\d+/;
return this.sort(function(as, bs){
a= String(as).toLowerCase().match(rx);
b= String(bs).toLowerCase().match(rx);
while(a.length && b.length){
a1= a.shift();
b1= b.shift();
if(rd.test(a1) || rd.test(b1)){
if(!rd.test(a1)) return 1;
if(!rd.test(b1)) return -1;
if(a1!= b1) return a1-b1;
}
else if(a1!= b1) return a1> b1? 1: -1;
}
return a.length- b.length;
});
}
Or, from Alphanum: Javascript Natural Sorting Algorithm by Brian Huisman:
Array.prototype.alphanumSort = function(caseInsensitive) {
for (var z = 0, t; t = this[z]; z++) {
this[z] = [];
var x = 0, y = -1, n = 0, i, j;
while (i = (j = t.charAt(x++)).charCodeAt(0)) {
var m = (i == 46 || (i >=48 && i <= 57));
if (m !== n) {
this[z][++y] = "";
n = m;
}
this[z][y] += j;
}
}
this.sort(function(a, b) {
for (var x = 0, aa, bb; (aa = a[x]) && (bb = b[x]); x++) {
if (caseInsensitive) {
aa = aa.toLowerCase();
bb = bb.toLowerCase();
}
if (aa !== bb) {
var c = Number(aa), d = Number(bb);
if (c == aa && d == bb) {
return c - d;
} else return (aa > bb) ? 1 : -1;
}
}
return a.length - b.length;
});
for (var z = 0; z < this.length; z++)
this[z] = this[z].join("");
}
这篇关于数字功放和排序数组;按字母顺序排列的元素(自然排序)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文