2013-06-10 40 views
6

Tôi cần sắp xếp một mảng các mục chữ và số như sau. Từ:Sắp xếp chuỗi chữ và số Giảm dần

2 xxx 
20 axxx 
38 xxxx 
20 bx 
8540 xxxxxx 

tới:

8540 xxxxx 
38 xxxx 
20 axxx 
20 bx 
2 xxx 

Do đó, sắp xếp giảm dần đối với những con số, sau đó tăng dần theo thứ tự abc. Các con số luôn tách biệt với các ký tự chữ cái (ký hiệu là "xxxx") bởi một dấu cách, nhưng các số có độ dài thay đổi. Tôi nghi ngờ tôi cần sử dụng một số Regex trong hàm sort() và chia nhỏ các số theo không gian rồi phân loại nó, nhưng tôi không biết làm thế nào để buộc trong sắp xếp theo thứ tự bảng chữ cái. Bất kỳ mẫu mã nào? Cám ơn rất nhiều!

+0

Kiểm tra ra những câu trả lời để xem bạn có thể điều chỉnh giải pháp: http://stackoverflow.com/a/4321879/1375372 http://stackoverflow.com/a/11931192/1375372 http://stackoverflow.com/a/4340339/1375372 –

Trả lời

6

Không cần RegEx, vì Array.sort() chấp nhận chức năng tùy chỉnh:

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 biết rằng '. sort() 'chấp nhận một hàm tùy chỉnh; họ đã tự hỏi về việc sử dụng regex trong hàm đó (mặc dù, như bạn đã chỉ ra, '.split()' là đủ trong trường hợp này, một định dạng đầu vào phức tạp hơn có thể gọi cho regex). – nnnnnn

+0

@Passerby cảm ơn rất nhiều! Nó hoạt động hoàn hảo !! – Wagtail

4

Something như thế này sẽ làm việc:

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

Cũng giống như một lưu ý phụ, jsfiddle đã không làm việc cho tôi. Tôi thấy làm thế nào về mặt lý thuyết nên làm việc, nhưng chức năng tách ("") dường như có vấn đề. Cảm ơn câu trả lời tốt anyways! – Wagtail

+1

Tôi không thấy cách '.split (" ")' có thể gây ra vấn đề cho bạn khi câu trả lời bạn chấp nhận sử dụng cùng một kỹ thuật. Bạn không cố gắng thử nghiệm fiddle với một phiên bản cũ của IE? Tôi đưa vào một câu lệnh 'console.log()', đưa ra một lỗi trong IE cũ nếu bàn điều khiển không thực sự mở vào lúc đó, nhưng nếu không nó hoạt động tốt. – nnnnnn

+0

Ah, tôi hiểu rồi. Jsfiddle không hoạt động đối với tôi trong phiên bản mới nhất của Chrome – Wagtail

Các vấn đề liên quan