6

I have an unordered list that can look something like this:

1.1.1
1.1.1.1
1.1.2
1.10.1
1.10.2
1.2.1
1.2.2
1.2.3
1.2.4
1.20.1
1.3.1

And I want to sort it like "numerical" order in Javascript.

1.1.1
1.1.1.1
1.1.2
1.2.1
1.2.2
1.2.3
1.2.4
1.3.1
1.10.1
1.10.2
1.20.1

Which sort function I need?

beowulf13th
  • 447
  • 1
  • 6
  • 16
  • Maybe [it](http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array-by-a-field-value-in-javascript?rq=1) helps. – Beterraba Jan 10 '14 at 17:35
  • "Which sort function I need?" -- This is really not a good question, it's more like, "can you make me a sort function?". We expect to see some code, what you tried, what went wrong, how did you debug your code, etc... – elclanrs Jan 10 '14 at 17:38
  • 1
    Check out the `cmpVersion` function here: http://stackoverflow.com/a/7717160/380487 – nrabinowitz Jan 10 '14 at 17:39
  • by look at your expected output, i am not able to understand in which order you want your result. Can u explain bit more. – SK. Jan 10 '14 at 17:42
  • First column has only one value, second has sorted and third has doesn't, how u want to sort... – SK. Jan 10 '14 at 17:45
  • 1
    @Mike He wants them sorted as version numbers – kei Jan 10 '14 at 17:47

2 Answers2

6

You can try:

Array.prototype.sortVersions = function() {
return this.map(function(e) {
  return e.split('.').map(function(e) {
    return parseInt(e)
   }
 )}).sort(function(a,b) {
   for (var i = 0; i < Math.max(a.length, b.length); i++) { 
     if (!a[i]) return -1; 
     if (!b[i]) return 1; 
     if (a[i]-b[i] != 0) return a[i]-b[i]; 
   } 
   return 0; 
 }).map(function(e) {
   return e.join('.')
 });
}

['1.1.1','1.1.1.1','1.1.2','1.10.1','1.10.2','1.2.1','1.2.2','1.2.3','1.2.4','1.20.1','1.3.1'].sortVersions()
BroiSatse
  • 44,031
  • 8
  • 61
  • 86
0

Here is the code that works for me:

var arr = [
  '1.2.2',
  '1.1.1',
'1.1.1.1',
'1.1.2',
'1.10.1',
'1.10.2',
'1.2.1',
'1.2.2',
'1.2.3',
'1.2.4',
'1.20.1',
'1.3.1'];

arr.sort(function(a, b) {
    return versionCompare(a, b);
  });

console.log(arr);

function versionCompare(v1, v2, options) {
    var lexicographical = options && options.lexicographical,
        zeroExtend = options && options.zeroExtend,
        v1parts = v1.split('.'),
        v2parts = v2.split('.');

    function isValidPart(x) {
        return (lexicographical ? /^\d+[A-Za-z]*$/ : /^\d+$/).test(x);
    }

    if (!v1parts.every(isValidPart) || !v2parts.every(isValidPart)) {
        return NaN;
    }

    if (zeroExtend) {
        while (v1parts.length < v2parts.length) v1parts.push("0");
        while (v2parts.length < v1parts.length) v2parts.push("0");
    }

    if (!lexicographical) {
        v1parts = v1parts.map(Number);
        v2parts = v2parts.map(Number);
    }

    for (var i = 0; i < v1parts.length; ++i) {
        if (v2parts.length == i) {
            return 1;
        }

        if (v1parts[i] == v2parts[i]) {
            continue;
        }
        else if (v1parts[i] > v2parts[i]) {
            return 1;
        }
        else {
            return -1;
        }
    }

    if (v1parts.length != v2parts.length) {
        return -1;
    }

    return 0;
}

Check out my plunker (look at javascript file and open console). Via

Community
  • 1
  • 1
Roman Pushkin
  • 5,639
  • 3
  • 40
  • 58