2014-01-10 3 views
4

У меня есть неупорядоченный список, который может выглядеть примерно так:Сортировать два «номеров» с несколькими точками

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 

Какую функцию мне нужно?

+0

Может быть, [он] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array-by-a-field-value- in-javascript? rq = 1). – Beterraba

+0

«Какая функция сортировки мне нужна?» - Это действительно не очень хороший вопрос, это больше похоже: «Можете ли вы сделать мне функцию сортировки?». Мы ожидаем увидеть какой-то код, что вы пытались, что пошло не так, как вы отлаживали ваш код и т. Д. – elclanrs

+1

Проверьте функцию 'cmpVersion' здесь: http://stackoverflow.com/a/7717160/380487 – nrabinowitz

ответ

5

Вы можете попробовать:

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

Спасибо, мужик! – beowulf13th

+0

Спасибо, отлично! – Flappy

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

Смежные вопросы