【问题标题】:Sort two “numbers” with multiple dots用多个点对两个“数字”进行排序
【发布时间】:2014-01-29 19:17:55
【问题描述】:

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

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

我需要哪种排序功能?

【问题讨论】:

  • 也许it 有帮助。
  • "我需要哪种排序功能?" ——这真的不是一个好问题,更像是“你能给我一个排序函数吗?”。我们希望看到一些代码,您尝试了什么,出了什么问题,您是如何调试代码的,等等...
  • 在这里查看cmpVersion函数:stackoverflow.com/a/7717160/380487
  • 通过查看您的预期输出,我无法理解您想要结果的顺序。你能解释一下吗?
  • @Mike He 希望它们按版本号排序

标签: javascript sorting numerical


【解决方案1】:

你可以试试:

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

【讨论】:

    【解决方案2】:

    下面是适合我的代码:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      相关资源
      最近更新 更多