2016-06-12 18 views
2

Ich versuche, eine Liste von Zeichenfolgen zu sortieren, die eine numerische & Alpha-Sequenz enthalten. Ich möchte zuerst nach Nummer und dann nach Alpha wie 1a, 2b, 4, 77c, 743 usw. sortieren.Sortieren einer Liste von numAlpha Strings

Ich habe mit dem folgenden Javascript herum gespielt und ich bin nah dran, meinen Kopf vom Kopf zu schlagen Mauer. Kann mir jemand ein paar Hinweise geben?

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

Was ist das gewünschte Ergebnis in 'a2'? –

Antwort

2

Sie können einen regulären Ausdruck für das Aufspalten der Saiten mit Look-Ahead für nicht numerische Werte verwenden.

Zum Beispiel '13c' wird nach dem Aufteilen ['13', 'c'].

Im Callback wird der Wert oder der Standardwert wie die leere Zeichenfolge zum Vergleich verwendet.

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

Gah! Ich habe die Eingabedaten falsch gelesen und obwohl es einige mit den Buchstaben und Zahlen gab, die umgekehrt sind; sie scheinen nicht zu sein, also ist das viel einfacher als meins. –

+1

Stimmt, das ist richtig und sehr knapp! Vielen Dank! – Seamus

1

Wenn das Ziel ist, zuerst von dem (ersten) numerischen Teil in jeder Kette zu sortieren, und dann innerhalb von Einträgen, die den gleichen Zahlenwert haben, die von dem (ersten) alpha Teil die Zeichenfolge, das tut es   — siehe Kommentare:

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

Danke! Genau das suche ich. – Seamus

+0

@whoquestionmark: Keine Sorge. Wenn die Zahlen wie in den Beispieldaten immer vor den Buchstaben stehen, dann ist Ninas Antwort der einfachere Weg. Aus irgendeinem Grund dachte ich, ich hätte einige mit den Buchstaben zuerst gesehen (z. B. "a1" statt "1a"), aber sie sind nicht da, also ... –

Verwandte Themen