2014-01-10 20 views
4

我有一个无序列表,可以是这个样子:排序两个“数字”多点

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 

我需要哪种排序功能?

+0

也许[它](http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array-by-a-field-value- in-javascript?rq = 1)有帮助。 – Beterraba

+0

“我需要哪种功能?” - 这真的不是一个好问题,更像是“你能让我成为一种排序功能吗?”。我们期望看到一些代码,你尝试过什么,出了什么问题,你是如何调试你的代码等的。 – elclanrs

+1

查看这里的'cmpVersion'函数:http://stackoverflow.com/a/7717160/380487 – nrabinowitz

回答

5

你可以试试:

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

谢谢你,男人! – beowulf13th

+0

非常感谢! – Flappy

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