2016-01-18 17 views
9

Tôi đang cố sử dụng chức năng localeCompare của JavaScript để sắp xếp chuỗi.Lực lượng địa phươngTính năng phân biệt chữ hoa chữ thường

Tôi đã rất ngạc nhiên bởi kết quả của chạy những dòng sau trong DevTools console:

"a".localeCompare("b") // returns: -1 
"A".localeCompare("b") // returns: -1 

Một thử nghiệm:

"b".localeCompare("a") // returns: 1 
"B".localeCompare("a") // returns: 1 

Ngay cả khi tôi cụ thể hơn về loại của tôi, tôi nhận được cùng một kết quả:

"a".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1 
"A".localeCompare("b", { usage: "sort", sensitivity: 'variant' }) // -1 
"b".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1 
"B".localeCompare("a", { usage: "sort", sensitivity: 'variant' }) // 1 

Tôi muốn sử dụng localeCompare để so sánh các chuỗi trong trường hợp nhạy cảm cách, vì vậy không nên "b" so với "a" và "B" so với "a" có kết quả ngược lại?

+1

Tôi sẽ đề xuất cung cấp đối số 'vị trí ', nhưng ít nhất với' "vi" 'không tạo sự khác biệt. Cũng đã thử tùy chọn '" caseFirst "', nhưng điều đó cũng không tạo ra sự khác biệt, mặc dù nó nói * Triển khai không bắt buộc phải hỗ trợ thuộc tính này. * –

+0

Xin lỗi, tôi không hiểu rõ sự nhầm lẫn của bạn, làm thế nào ' b' xảy ra trước 'A' theo thứ tự chữ cái? – Teemu

+0

@Teemu Tôi đã thêm một ví dụ khác trong câu hỏi của tôi để hiển thị trường hợp ngược lại ... không nên "B" trước "a"? –

Trả lời

5

LocalCompare có thể phân biệt chữ hoa chữ thường, được bật bởi { sensitivity: 'case'} hoặc phần mở rộng unicode: u-kf-upper hoặc u-kf-lower.

Các spec of LocalCompare nói rằng:

Kết quả được thiết kế để đặt hàng giá trị String trong thứ tự sắp xếp theo quy định của địa phương mặc định hệ thống

Hoặc locale bạn có thể thêm như là đối số.

Các mặc định cho en-US đối với trường hợp thứ tự nhạy cảm là "thấp hơn" với:

aAbBcC ... 

Bạn có thể thay đổi nó để "trên", đó là:

AaBbCc ... 

Thử nghiệm này cho thấy rằng việc chuyển từ upper đến lower chỉ ảnh hưởng đến cùng một chữ cái và không sắp xếp chữ hoa-chữ thường trước chữ thường hoặc ngược lại.

var b = "A".localeCompare("a", 'en-US-u-kf-lower'); // 1 
var c = "A".localeCompare("a", 'en-US-u-kf-upper'); // -1 
var d = "A".localeCompare("b", 'en-US-u-kf-upper'); // -1 
var e = "A".localeCompare("b", 'en-US-u-kf-lower'); // -1 

  • Có thể có một miền địa phương mà sắp xếp chữ hoa/chữ thường khác nhau, nhưng tôi không biết về bất kỳ ...
  • thứ tự sắp xếp quốc tế là trường hợp nhạy cảm
  • ASCII loại đơn đặt hàng sẽ là ACb
  • Một số miền địa phương có các đơn đặt hàng khác nhau: Phần Lan ví dụ treads V như W: Va Wb Vc ...

Độ nhạy của chữ có ảnh hưởng đến giá trị số theo bất kỳ cách nào không?

var b = "1".localeCompare("a", 'en-US-u-kf-lower'); // -1 
var c = "1".localeCompare("A", 'en-US-u-kf-upper'); // -1 
var d = "104".localeCompare("a", 'en-US-u-kf-upper'); // -1 

không, nhưng ...

có một tùy chọn, làm thế nào giá trị số có thể được so sánh: kn

với các tùy chọn hoặc gia hạn Unicode kn người ta có thể kích hoạt tính năng so sánh số (kn-true):

var b = "10".localeCompare("2", 'en-US-u-kn-true'); // 1 
var c = "10".localeCompare("2", 'en-US'); // -1 

Tuy nhiên, các số luôn luôn trước chữ cái:

var d = "1".localeCompare("a", 'en-US-u-kn-true'); // -1 
var e = "1".localeCompare("a", 'en-US'); // -1 
+0

Bất kỳ ý tưởng nào về cách sắp xếp số sau chuỗi? như '" 109 ".localCompare ('a')' – Vadorequest

+0

@Vadorequest Không, tôi không nghĩ điều đó có thể xảy ra với localCompare. – jHilscher

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