Solved

alphanumeric value sorting

Posted on 2015-01-20
8
207 Views
Last Modified: 2015-01-29
How to do alphanumeric value sorting in javascript  or jquery

A10
B100
A2
AA1
AD200
32
11
A1

and the i want the result should be
A1
A2
A10
B2
B100
AD200
11
32
0
Comment
8 Comments
 
LVL 4

Assisted Solution

by:Monika Bharti
Monika Bharti earned 50 total points
Comment Utility
This will give proper sorting for values like A1, A2, A3, etc as well as values without a street number.

function naturalSorter(as, bs){
    var a, b, a1, b1, i= 0, n, L,
    rx=/(\.\d+)|(\d+(\.\d+)?)|([^\d.]+)|(\.\D+)|(\.$)/g;
    if(as=== bs) return 0;
    a= as.toLowerCase().match(rx);
    b= bs.toLowerCase().match(rx);
    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;
}

Open in new window

Then
arr.sort(function(o1, o2) {
    return naturalSorter(o1.t, o2.t);
});

Open in new window

0
 
LVL 15

Expert Comment

by:navneethegde
Comment Utility
HI!

Check if this helps.
<script>

var testCode = ['A10','B100','A2','AA1','AD200','32','11','A1'];
var rte = testCode.sort();

document.write(rte);
</script>

Open in new window





Thanks!
0
 
LVL 20

Author Comment

by:Sathish David Kumar N
Comment Utility
@navneethegde please check this test code .

var testCode = ['A10','B100','A2','AA1','AD200','32','11','1','2','10','100','A1'];

Thanks @Monika but its sort number correctly but not alphanumeric value
0
 
LVL 5

Assisted Solution

by:GuruJava
GuruJava earned 50 total points
Comment Utility
arr.sort(function(o1, o2) {
           var a = o1.t.split(/(\d+|\D+)/).filter(function(s){return s!=""});
           var b = o2.t.split(/(\d+|\D+)/).filter(function(s){return s!=""});
           for (var cmp = 0, i = 0; 0 == cmp && i < a.length && i < b.length; i++) {
             var n1 = a[i] - 0, n2 = b[i] - 0;
             if (!isNaN(n1) && !isNaN(n2)) 
               cmp = n1 - n2;
             else if (a[i] < b[i]) 
               cmp = -1;
             else if (a[i] > b[i])
               cmp = 1;
           }
           return cmp;
         })

Open in new window

0
Better Security Awareness With Threat Intelligence

See how one of the leading financial services organizations uses Recorded Future as part of a holistic threat intelligence program to promote security awareness and proactively and efficiently identify threats.

 
LVL 15

Expert Comment

by:navneethegde
Comment Utility
here it is
1,10,100,11,2,32,A1,A10,A2,AA1,AD200,B100

Open in new window

0
 
LVL 15

Accepted Solution

by:
navneethegde earned 350 total points
Comment Utility
Hi!
You can try the below one as well
the result of below is : 1,2,10,11,32,100,A1,A2,A10,AA1,AD200,B100

<script>
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;
    }
}

var testCode = ['A10','B100','A2','AA1','AD200','32','11','1','2','10','100','A1'].sort(sortAlphaNum);

document.write(testCode);

</script>

Open in new window



Thanks!
0
 
LVL 75

Expert Comment

by:Michel Plungjan
Comment Utility
@navneethegde did you read the question?

and the I want the result should be
A1
A2
A10
B2
B100
AD200
11
32
0
 
LVL 75

Assisted Solution

by:Michel Plungjan
Michel Plungjan earned 50 total points
Comment Utility
My suggestion

JSFIDDLE

function rxIndexOf(rx,arr) { for (var i in arr) {if (arr[i].toString().match(rx)) { return i; }} return -1; }
function splitAlp(str) { return {num  : str.replace(/[^0-9]+/ig,"")||"",alph : str.replace(/[0-9]/g,"") ||"" }}
function numSort(a,b) { if (a===b) return 0; return parseInt(a,10)>parseInt(b,10)?1:-1; }

function alpSort(a,b) {
    if (a===b) return 0;
    var a1 = splitAlp(a);
    var b1 = splitAlp(b);
    if (a1.alph>b1.alph && parseInt(a1.num,10)>parseInt(b1.num,10)) return 1;
    if (a1.alph==b1.alph && parseInt(a1.num,10)>parseInt(b1.num,10)) return 1;
    return -1;
}
var alp,num; 
var arr = "A10,B100,A2,AA1,2,AD200,32,11,A1".split(",").sort();
var idx = rxIndexOf(/[a-zA-Z]/,arr);
if (idx !=-1) {
    num = arr.slice(0,idx).sort(numSort);
    arr = arr.slice(idx).sort(alpSort);
}   
if (num) arr=arr.concat(num);

Open in new window

0

Featured Post

Why You Should Analyze Threat Actor TTPs

After years of analyzing threat actor behavior, it’s become clear that at any given time there are specific tactics, techniques, and procedures (TTPs) that are particularly prevalent. By analyzing and understanding these TTPs, you can dramatically enhance your security program.

Join & Write a Comment

Introduction Chart.js, used properly, can visually add a difference to your charting applications. It engages your visitors and allows them to interact with data they otherwise wouldn't be able to without expensive and complicated systems. For this…
This article discusses how to create an extensible mechanism for linked drop downs.
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)
The viewer will learn the basics of jQuery including how to code hide show and toggles. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery…

728 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now