Javascript 第二类“;数字”;多点

Javascript 第二类“;数字”;多点,javascript,sorting,numerical,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 我需要哪种排序功能?以下是适用于我的代码: var arr = [ '1.2.2', '1.1.1',

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

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

我需要哪种排序功能?

以下是适用于我的代码:

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;
}
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(函数(a,b){
返回版本比较(a、b);
});
控制台日志(arr);
功能版本比较(v1、v2、选项){
var lexicographical=options&&options.lexicographical,
zeroExtend=options&&options.zeroExtend,
v1parts=v1.split('.'),
v2parts=v2.split('.');
函数isValidPart(x){
返回(词典?/^\d+[A-Za-z]*$/:/^\d+$/).test(x);
}
如果(!v1parts.every(isValidPart)| |!v2parts.every(isValidPart)){
返回NaN;
}
如果(零扩展){
而(v1parts.lengthv2parts[i]){
返回1;
}
否则{
返回-1;
}
}
如果(v1parts.length!=v2parts.length){
返回-1;
}
返回0;
}
签出(查看javascript文件并打开控制台)

您可以尝试:

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()
Array.prototype.sortVersions=function(){
返回此.map(函数(e){
返回e.split('.').map(函数(e){
返回parseInt(e)
}
)}).排序(功能(a、b){
对于(var i=0;i
也许有帮助。“我需要哪个排序函数?”--这真的不是一个好问题,更像是“你能给我做一个排序函数吗?”。我们希望看到一些代码,您尝试了什么,出了什么问题,您是如何调试代码的,等等。请查看此处的
cmpVersion
函数:通过查看您的预期输出,我无法理解您希望结果的顺序。你能再解释一下吗?迈克,他想把它们按版本号排序