Angular: сортировка версий программного обеспечения по алфавиту - PullRequest
0 голосов
/ 03 января 2019

Мне нужно составить алфавитный список версий программного обеспечения на Angular от самой последней до самой старой (т. Е. 1.10.3.e, 1.9.5.b, 1.7.3, 1.5.1.c). Я использовал .sort (), который сортирует в алфавитном порядке, но обрабатывает значения как строку, что приводит к сортировке любой версии 1.10 после версии 1.5, так как она смотрит на 1 и 0 независимо. Я попытался сделать .sort ((a, b ) => b - a) и он полностью рандомизировал список, а не сортировал его. Я также попытался использовать .slice ('.'), Который, кажется, не работает.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 03 января 2019

Решение 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) : сортировка по целым числам и строкам.
Я бы назвал это более элегантным решением, даже если оно немного сложнее.
(Такой ответ с целыми числами уже дан)

0 голосов
/ 03 января 2019

Ответить на этот вопрос непросто, так как нужно учесть несколько переменных. Если предположить, , что у вас никогда не будет версий, таких как 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);
...