2015-09-04 70 views
0

我需要一個列表排序,這是字母數字,但它搞壞了多位數 整數,因爲它是字符一個字符,1是小於8排序算法 - 使用Javascript

任何它都特別棘手,因爲在數字前後可以有字母字符。因此,如果它能夠以某種方式理解整數而不是單個數字,那麼就可以做到這一點。

正常排序

  1. 10級學術
  2. 10級應用
  3. 11年級
  4. 8級
  5. 級9

所需的排序:

  1. 8級
  2. 9年級
  3. 10年級學業
  4. 10級應用
  5. 11年級

任何人都知道如何做一個Javascript腳本,這樣排序?或者,如果你使用AngularJS解決方案,那就更好了。

在此先感謝您提供的任何幫助。

+2

你做了什麼努力? –

+2

您需要提供某種嘗試,以便我們提供幫助。通常的做法是通過用零填充來使所有數字固定寬度。那時,一個標準的alphanum類將按預期工作。 – CollinD

+0

@ DanielA.White他寫過這樣一個問題:D – Vidul

回答

0
var arr = [ 
    "Grade 10 Applied", 
    "Grade 10 Academic", 
    "Grade 11", 
    "Grade 11 Testy", 
    "Grade 9", 
    "Grade 8" 
]; 

alert(arr.sort(function(a, b) { 
    // split the strings into arrays of words 
    var aParts = a.split(' '); 
    var bParts = b.split(' '); 
    // compare the corresponding words, if they are integers parseInt first 
    for(var i=0; i < Math.min(aParts.length, bParts.length); i++) { 
    var aPart = /\d+/.test(aParts[i]) ? parseInt(aParts[i]) : aParts[i]; 
    var bPart = /\d+/.test(bParts[i]) ? parseInt(bParts[i]) : bParts[i]; 
    if(aPart === bPart) { continue; } 
    return aPart < bPart ? -1 : 1; 
    } 
    // fall back to using the array's length 
    // ["dog", "cat"] < ["dog", "cat", "frog"] 
    return aParts.length - bParts.length 
}).join('\n'));