Sort Array of numeric & alphabetical elements (Natural Sort)

后端 未结 8 1040
独厮守ぢ
独厮守ぢ 2020-12-03 14:48

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 ...

相关标签:
8条回答
  • 2020-12-03 15:08

    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("");
    }
    
    0 讨论(0)
  • 2020-12-03 15:09

    This is a refined.

    var arr = [1,5,"ahsldk",10,55,3,2,7,8,1,2,75,"56","abc","huds"];
        arr.sort(
                    function (a,b){
                        if ( isNaN(a)&&isNaN(b)) return a<b?-1:a==b?0:1;//both are string
                        else if (isNaN(a)) return 1;//only a is a string
                        else if (isNaN(b)) return -1;//only b is a string
                        else return a-b;//both are num
                    }
        );
    

    result: 1|1|2|2|3|5|7|8|10|55|56|75|abc|ahsldk|huds|

    0 讨论(0)
提交回复
热议问题