2016-06-12 76 views
2

我想排序包含數字& alpha序列的字符串列表。我想先按數字排序,然後按alpha,如1a,2b,4,77c,743等排序。排序numAlpha字符串列表

我一直在玩着下面的javascript,我已經接近將我的頭撞過壁。任何人都可以給我一些指點嗎?

var a1 = ["4a", "4c", "1a", "4b", "13c", "4a", "1a", "11c", "112c", "12", "9"]; 

var a2 = a1.sort(function(a, b) { 

    if (a.slice(-1) == "a" || a.slice(-1) == "b" || a.slice(-1) == "c") { 
    var charPart = [a.slice(-1), b], 
     numPart = [a.slice(0, a.length - 1), b]; 
    if (b.slice(-1) == "a" || b.slice(-1) == "b" || b.slice(-1) == "a") { 
     var charPart = [a.slice(-1), b.slice(-1)], 
     numPart = [a.slice(0, a.length - 1), b.slice(0, b.length - 1)]; 
    } 
    } 


    if (numPart[0] < numPart[1]) return -1; 
    else if (numPart[0] > numPart[1]) return 1; 
    else if (numPart[0] == numPart[1]) return -1; 
    else { 
    if (charPart[0] < charPart[1]) return -1; 
    else if (charPart[0] > charPart[1]) return 1 
    } 
}); 

http://jsfiddle.net/8fRsD/307/

+0

「a2」中你想要的結果是什麼? –

回答

2

你可以使用正則表達式與前瞻非數值分裂字符串。

例如'13c'在拆分後變成['13', 'c']

在回調中,值或缺省值(如空字符串)用於比較。

var a1 = ["4a", "4c", "1a", "4b", "13c", "4a", "1a", "11c", "112c", "12", "9"]; 
 
\t \t 
 
a1.sort(function (a, b) { 
 
    var aa = a.split(/(?=\D)/), 
 
     bb = b.split(/(?=\D)/); 
 
    return aa[0] - bb[0] || (aa[1] || '').localeCompare(bb[1] || ''); 
 
}); 
 
console.log(a1);

+1

嘎!我誤讀了輸入數據,儘管有些字母和數字是相反的;他們似乎不是,所以這比我的簡單得多。 –

+1

沒錯,這是正確的,非常簡潔!謝謝! – Seamus

1

如果目標是通過在每個串(第一)數字部分的第一排序,然後內具有相同的數值,由(第一)的α部分的條目字符串,這樣做是  —看評論:

var a1 = ["4a", "4c", "1a", "4b", "13c", "4a", "1a", "11c", "112c", "12", "9"]; 
 
a1.sort(function(l, r) { 
 
    var lnum = l.match(/\d+/); 
 
    var rnum = r.match(/\d+/); 
 
    if (lnum && rnum) { 
 
    // We have numbers, compare them 
 
    lnum = +lnum[0]; 
 
    rnum = +rnum[0]; 
 
    if (lnum != rnum) { 
 
     // Not the same, put the smaller one first 
 
     return lnum - rnum; 
 
    } 
 
    } 
 
    
 
    // Either no numbers, or they match; use alpha 
 
    var lalpha = l.match(/\D+/); 
 
    var ralpha = r.match(/\D+/); 
 
    if (lalpha && ralpha) { 
 
    // We have alpha, return result of comparing them 
 
    return lalpha[0].localeCompare(ralpha[0]); 
 
    } 
 
    
 
    // Neither numbers or alpha; give up 
 
    return 0; 
 
}); 
 
console.log(a1);

+0

謝謝!這正是我正在尋找的。 – Seamus

+0

@whoquestionmark:無後顧之憂。如果數字始終位於字母之前,那麼Nina的答案就是更簡單的方法。出於某種原因,我以爲我先看過一些字母(例如'a1'而不是'1a'),但他們不在那裏,所以...... –