2011-05-16 85 views
4

我有一個字母和數字的組合。例如:2E12,1Z10,3D13,3D03,FB14,X002等Javascript - 排序字母組合

我試過一些方法來排序這些字符串,但似乎沒有任何工作。 parseInt在叢中工作,但整個數組從不排序(它是一個json數組),如果再次運行排序,會出現不同的結果。

我也嘗試過使用正則表達式來替換所有帶有數字的字母,但是這會產生一個邏輯錯誤。每次在字符串中間的一個大字母被替換時,它會將數字增加10或20倍。例如,1Z10會創建12610,即使它以1開頭並且應該朝上排列。

有誰知道如何對這些字符串進行排序?不管信件是第一個還是數字都是第一個,只要我可以遠離隨機的對象。

在此先感謝!

+2

你能舉一個例子的排序順序,您正試圖獲得?一個簡單的字符串排序應該像你問的那樣做,例如http://www.javascriptkit.com/javatutors/arraysort.shtml – 2011-05-16 15:40:17

回答

10

如果你想要的數字序列進行排序,如果他們的數字,阿爾法前 使100種2之後,你需要什麼是所謂的自然排序 -

這是一個例子,谷歌會發現更多。

// case insensitive, digits to number interpolation 

function natSort(as, bs){ 
    var a, b, a1, b1, i= 0, L, rx= /(\d+)|(\D+)/g, rd= /\d/; 
    if(isFinite(as) && isFinite(bs)) return as - bs; 
    a= String(as).toLowerCase(); 
    b= String(bs).toLowerCase(); 
    if(a=== b) return 0; 
    if(!(rd.test(a) && rd.test(b))) return a> b? 1: -1; 
    a= a.match(rx); 
    b= b.match(rx); 
    L= a.length> b.length? b.length: a.length; 
    while(i < L){ 
     a1= a[i]; 
     b1= b[i++]; 
     if(a1!== b1){ 
      if(isFinite(a1) && isFinite(b1)){ 
       if(a1.charAt(0)=== "0") a1= "." + a1; 
       if(b1.charAt(0)=== "0") b1= "." + b1; 
       return a1 - b1; 
      } 
      else return a1> b1? 1: -1; 
     } 
    } 
    return a.length - b.length; 
} 

變種S = '2E12,1Z10,1Z2,3D13,3D03,FB14,X002'.split(',「);

s.sort(natSort)

/* returned value: (Array) 
1z2,1Z10,2E12,3D03,3D13,FB14,X002 
*/ 
+0

幹得好。謝謝! – 2011-11-15 17:32:51

+0

奇妙和瘋狂,我想它是有道理的(雖然令人討厭),排序()自然排序模式是先做數字,數字與字母秒 – efwjames 2014-03-30 00:52:27