数字功放和排序数组;按字母顺序排列的元素(自然排序) [英] Sort Array of numeric & alphabetical elements (Natural Sort)

查看:124
本文介绍了数字功放和排序数组;按字母顺序排列的元素(自然排序)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有一个数组

  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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆