2013-06-10 3 views
6

Мне нужно отсортировать массив буквенно-цифровых элементов следующим образом. От:Сортировка буквенно-цифровой строки Descending

2 xxx 
20 axxx 
38 xxxx 
20 bx 
8540 xxxxxx 

к:

8540 xxxxx 
38 xxxx 
20 axxx 
20 bx 
2 xxx 

Таким образом, отсортированный по убыванию по номерам, а затем по возрастанию по алфавиту. Цифры всегда отделяются от алфавитных символов (обозначаемых «xxxx») одним пробелом, но числа являются переменной длиной.

Я подозреваю, что мне нужно использовать какое-то регулярное выражение в функции sort() и отделять числа от пробела, а затем сортировать его, но я не знаю, как связать его в алфавитном порядке. Любые примеры кода? Спасибо!

+0

Проверьте эти ответы чтобы проверить, можете ли вы адаптировать Решение: http://stackoverflow.com/a/4321879/1375372 http://stackoverflow.com/a/11931192/1375372 http://stackoverflow.com/a/4340339/1375372 –

ответ

6

Нет необходимости RegEx, поскольку Array.sort() принимает пользовательскую функцию:

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

ОП знает, что '. sort() 'принимает пользовательскую функцию; они задавались вопросом об использовании регулярного выражения в этой функции (хотя, как вы уже указали, '.split()' достаточно в этом случае, более сложный формат ввода может вызвать регулярное выражение). – nnnnnn

+0

@Passerby огромное спасибо! Он отлично работает! – Wagtail

4

Что-то, как это будет работать:

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]); 
}); 

Демо: http://jsfiddle.net/KLa2J/

+0

Как примечание, jsfiddle не работает для меня. Я вижу, как это теоретически должно работать, но функция split (""), похоже, имеет проблемы. Спасибо за хороший ответ в любом случае! – Wagtail

+1

Я не вижу, как '.split (" ")' может вызывать проблемы, когда принятый вами ответ использует ту же технику. Вы не пытаетесь протестировать скрипку со старой версией IE? Я включил инструкцию 'console.log()', которая дает ошибку в старом IE, если консоль на самом деле не открыта в то время, но в остальном она отлично работает. – nnnnnn

+0

А, я вижу. Jsfiddle не работает для меня в новейшей версии Chrome – Wagtail

Смежные вопросы