JavaScript custom sort

by daybarr

HTML

<div>Answer for <a href="http://stackoverflow.com/q/4399122/445073">stackoverflow question</a>.</div>
<div>Enable firebug console to see before and after output</div>

JavaScript

var columnValues = [
  "CANCELLED", "v06.*", "INDEPENDENT", "v06.00", "v06.00.01",
  "v06.01", "v06.02", "v06.00.xx", "v06.03", "v06.04", "ON HOLD",
  "v06.06", "v06.05", "v06.05.01", "v06.04.01", "v06.05.02",
   "v06.07", "v07.00" ];
console.log('Before', columnValues);
columnValues.sort(function(a, b) {
    if (a==b) {
        return 0;
    }
    if (a.length && a[0]=='v' && b.length && b[0]=='v') {
        // Both strings are version strings.
        // Do special case version matching.
        var aParts = a.substring(1).split('.'),
            bParts = b.substring(1).split('.'),
            l = Math.max(a.length, b.length),
            i = 0;
        for (;i<l;i++) {
            var aPart = aParts[i],
                bPart = bParts[i];
            if (aPart == '*' && bPart != '*') {
                return -1;
            }
            if (bPart == '*' && aPart != '*') {
                return 1;
            }
            if (aPart == 'xx' && bPart != 'xx') {
                return 1;
            }
            if (bPart == 'xx' && aPart != 'xx') {
                return -1;
            }
            var aNum = parseInt(aPart,10),
                bNum = parseInt(bPart,10);
            if (aNum < bNum) {
                return -1;
            }
            if (aNum > bNum) {
                return 1;
            }
            // Same so far, try next part
        }
        // One must be longer than the other.
        return (aParts.length < bParts.length) ? -1 : 1
    }
    // Simple alphabetic comparison
    if (a < b)
        return -1;
    if (a > b)
        return 1;
});

console.log('After', columnValues);