2016-06-12 7 views
2

数字の&アルファシーケンスを含む文字列のリストをソートしようとしています。最初に数字でソートしてから、アルファベットで、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:心配はいりません。数値が常にサンプルデータのように文字の前に来る場合、ニーナの答えはより簡単な方法です。何らかの理由で私は文字を最初に見たと思っていましたが(例えば、「1a」ではなく「a1」)、そこにはありません。 –

関連する問題