Angular: 按字母顺序排序软件版本

Angular: sorting software versions alphabetically

我需要按字母顺序排列 Angular 中的软件版本列表,从最新到最旧(即 1.10.3.e、1.9.5.b、1.7.3、1.5.1.c).我一直在使用 .sort() ,它按字母顺序排序,但将值视为字符串,导致任何 1.10 版本在 1.5 版本之后排序,因为它查看 1 和 0 independently.I 尝试执行 .sort((a , b) => b - a) 并且它完全随机化了列表而不是对其进行排序。我也尝试过使用 .slice('.') 似乎不起作用。

有什么想法吗?

这不是一个容易回答的问题,因为有几个变数需要考虑。 假设你永远不会有像 1.1 这样的版本,1.a,那么下面应该可以解决问题。

var arr = ['1.10.3.e', '1.9.5.b', '1.7.3', '1.5.1.c', '1.5.1.a', '1.5.1.d', '1.10', '1.5']
          .map(a => a.split('.') // split by decimals
                     .map(i => Number.isNaN(parseInt(i, 10)) ? i : parseInt(i, 10))) // make numbers numbers, leave chars as strings
          .sort((a,b) => {
              // sort by multiple indexes and if one array is shorter, it's i item will be undefined
              var longerIndex = a.length > b.length ? a.length : b.length;
              for(var i = 0, l = longerIndex; i < l; i++) {
                if (a[i] > b[i] || b[i] === undefined) return 1;
                else if (a[i] < b[i] || a[i] === undefined) return -1;
              }

              return 0;
          })
          .map(a => a.join('.')) // join the version parts back into a single string
console.log(arr);

解决方案1): 临时填充 '0':

(如果版本号的一部分可以超过2位,padStart可以改为3, 4, ...)

var vers = [ '1.10.3.e', '1.9.5.b', '1.7.3', '1.5.1.c' ];
console.log( vers );

var temp = vers.map( function( s ){
    return s.split('.').map( function( n ){ return n.padStart(2,'0'); } ).join('.');
} )

temp.sort();

vers = temp.map( function( s ){
    return s.split('.').map( function( n ){ return n.replace(/^0+/, ''); } ).join('.');
} )

console.log( temp );
console.log( vers );

解决方法2):按整数和字符串分别排序
我会称之为更优雅的解决方案,即使它有点复杂。
(这样的答案,已经给出了整数)