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):按整数和字符串分别排序
我会称之为更优雅的解决方案,即使它有点复杂。
(这样的答案,已经给出了整数)
我需要按字母顺序排列 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):按整数和字符串分别排序
我会称之为更优雅的解决方案,即使它有点复杂。
(这样的答案,已经给出了整数)