用多个点对两个“数字”排序

时间:2014-01-10 17:33:08

标签: javascript sorting numerical

我有一个无序列表,看起来像这样:

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

我希望在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

我需要哪种排序功能?

2 个答案:

答案 0 :(得分:6)

您可以尝试:

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()

答案 1 :(得分:0)

以下是适用于我的代码:

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

查看my plunker(查看javascript文件并打开控制台)。 Via