2013-06-10 13 views
6

Potrzebuję posortować tablicę alfanumerycznych elementów w następujący sposób. Od:Sortuj alfanumeryczny łańcuch malejący

2 xxx 
20 axxx 
38 xxxx 
20 bx 
8540 xxxxxx 

do:

8540 xxxxx 
38 xxxx 
20 axxx 
20 bx 
2 xxx 

Zatem, sortowane malejąco względem liczby, następnie rosnąco alfabetycznie. Liczby są zawsze oddzielone od znaków alfabetycznych (oznaczonych "xxxx") pojedynczym odstępem, ale liczby mają zmienną długość.

Podejrzewam, że muszę użyć Regex w funkcji sort() i podzielić liczby przez spację, a następnie sortować, ale nie wiem, jak powiązać alfabetyczne sortowanie. Jakieś próbki kodu? Dzięki wielkie!

+0

Sprawdź te odpowiedzi aby sprawdzić, czy możesz dostosować rozwiązanie: http://stackoverflow.com/a/4321879/1375372 http://stackoverflow.com/a/11931192/1375372 http://stackoverflow.com/a/4340339/1375372 –

Odpowiedz

6

Nie potrzeba RegEx, ponieważ Array.sort() akceptuje niestandardową funkcję:

http://jsfiddle.net/EFGK9/

var arr=["2 xxx","20 axxx","38 xxxx","20 bx","8540 xxxxxx"]; 
arr.sort(function(a,b){ 
    a=a.split(" "); 
    b=b.split(" "); 
    var an=parseInt(a[0],10); 
    var bn=parseInt(b[0],10); 
    return an<bn?1:(an>bn?-1:(a[1]<b[1]?-1:(a[1]>b[1]?1:0))); 
}); 
console.log(arr); 
+1

OP wie, że '. sort() 'akceptuje funkcję niestandardową; zastanawiali się, czy użyć wyrażenia regularnego w tej funkcji (chociaż, jak już zauważyłeś, ".split()" wystarcza w tym przypadku, bardziej skomplikowany format wejściowy może wywoływać wyrażenie regularne). – nnnnnn

+0

@Passerby dzięki bardzo! Działa doskonale! – Wagtail

4

Coś jak to będzie działać:

var arr = [ 
    "2 xxx", 
    "20 axxx", 
    "38 xxxx", 
    "20 bx", 
    "8540 xxxxxx" 
    ]; 

arr.sort(function(a, b) { 
    var aParts = a.split(" "), 
     bParts = b.split(" "), 
     aNum = +aParts[0], // convert numeric parts 
     bNum = +bParts[0]; // to actual numbers 

    if (aNum > bNum) 
     return -1; 
    else if (aNum < bNum) 
     return 1; 
    else 
     return aParts[1].localeCompare(bParts[1]); 
}); 

Demo: http://jsfiddle.net/KLa2J/

+0

Tak jak na marginesie, jsfiddle nie działa dla mnie. Widzę, jak to teoretycznie powinno działać, ale funkcja podziału ("") wydaje się mieć problemy. Dzięki za dobrą odpowiedź i tak! – Wagtail

+1

Nie widzę, jak '.split (" ")' może powodować problemy, gdy zaakceptowana odpowiedź używa tej samej techniki. Nie próbujesz przetestować skrzypiec przy użyciu starej wersji IE? Zawarłem instrukcję 'console.log()', która powoduje błąd w starym IE, jeśli konsola nie jest faktycznie otwarta w tym czasie, ale poza tym działa poprawnie. – nnnnnn

+0

Ach, rozumiem. The jsfiddle nie działa dla mnie w najnowszej wersji Chrome – Wagtail