2015-08-07 33 views
5

Tôi cần sắp xếp danh sách theo góc, theo thứ tự bảng chữ cái (tăng dần) nhưng muốn ký tự đặc biệt nếu có tiền tố cho mục được đẩy ở cuối danh sách. Ví dụ: danh sách nên như sau:Sắp xếp danh sách theo thứ tự abc với các ký tự ở cuối

Apple 
Banana 
*Apple 

mọi đề xuất sẽ được đề xuất.

+0

có thể trùng lặp của http://stackoverflow.com/questions/5503900/how-to-sort-an-array-of-objects-with-jquery-or-javascript – dpanshu

+1

Không phải là một trùng lặp, nhưng không phải là xa ... – nageeb

+0

Chỉ cần sử dụng chức năng gọi lại 'sort()' và thêm 'z' vào chuỗi bắt đầu bằng ký tự đặc biệt, kiểm tra câu trả lời của tôi. –

Trả lời

2

Đây là một giải pháp khá đơn giản. Khi so sánh các chuỗi thủ công, thực hành tốt là sử dụng localeCompare sẽ sắp xếp chính xác ngay cả khi ngôn ngữ cụ thể của ngôn ngữ của người dùng ra lệnh cho một thứ tự sắp xếp khác nhau. Nhưng chức năng đó một mình sẽ không giải quyết được vấn đề của chúng ta. Dựa trên câu trả lời thông minh của @ wZVanG, chúng tôi sẽ thay thế bất kỳ ký tự không phải từ nào, sử dụng nhóm ký tự regex \W, ở đầu chuỗi bằng chữ cái z, sẽ tự động sắp xếp chúng ở cuối danh sách.

Lưu ý một lỗ hổng trong trường hợp này là nếu bất kỳ từ nào của bạn bắt đầu bằng nhiều hơn z chúng sẽ được sắp xếp sau các ký tự đặc biệt. Cách giải quyết đơn giản là thêm nhiều hơn z s vào chuỗi, như trong return a.replace(/^\W+/, 'zzz').localeCompare(b.replace(/^\W+/, 'zzz').

var array = ["Banana", "Apple", "*Canana", "Blackberry", "Banana", "*Banana", "*Apple"]; 

array.sort(function(a,b) { 
    return a.replace(/^\W+/, 'z').localeCompare(b.replace(/^\W+/, 'z')); 
}); 
+0

Lưu ý '\ W' cũng sẽ mất dấu gạch dưới '_' và sẽ được đặt hàng là' _Apple, Banana, * Apple'. Bạn có thể muốn '/^[^ a-z] +/i' –

2

Điều này có lẽ không chính xác nhưng tốt nhất tôi có thể nghĩ đến vào giờ này.

DEMO

var array = ["Apple", "Banana", "*Apple"]; 

// Split the arrays with and without special chars 
var alphaNumeric = array.filter(function (val) { 
    return !(/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(val)); 
}); 
var specialChars = array.filter(function (val) { 
    return /[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g.test(val); 
}); 

console.log(alphaNumeric, specialChars); 

// Sort them individually 
alphaNumeric.sort(); 
specialChars.sort(); 

// Bring them back together but put the special characters one afterwards 
var both = alphaNumeric.concat(specialChars); 

console.log(both); 
+0

Đây là cách tôi sẽ làm điều đó ... – nageeb

+0

hoạt động .. không phải là lý tưởng mặc dù nhưng không cho tôi, thx :) –

1
var list = ["Apple","Orange", "Banana", "*Banana","*Apple"]; 
regex= /^[A-z]+$/; 
dummyArray1=[]; 
dummyArray2=[]; 
for(var i =0;i< list.length; i++){ 

    if(regex.test(list[i][0])){ 
    dummyArray1.push(list[i]); 
    } 
    else{ 
    dummyArray2.push(list[i]); 
    } 
} 

console.log(dummyArray1.sort()); 
console.log(dummyArray2.sort()); 
console.log(dummyArray1.concat(dummyArray2)); 
1

Một dòng:

var sorted = ["Banana", "Apple", "*Canana", "Blackberry", "/Banana", "*Banana", "*Apple"] 
 
.sort(function(a, b, r){ 
 
    return r = /^[a-z]/i, (r.test(a) ? a : "z" + a) > (r.test(b) ? b : "z" + b) 
 
}); 
 

 

 
//Test 
 
document.write(sorted.join("<br />"));

Thêm Z nếu các mặt hàng không bắt đầu bằng chữ cái của bảng chữ cái.

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