localeCompareメソッドは2つの文字列を比較する。
a.localeCompare(b)の場合 a < bで負の値, a > b で正の値, a = b で0が返る。
注意なのはa.localeCompare(b) は、Unicode の規定に基づいた文字列のソート順序を使用している。そのため、文字列のソート順が文字のコードポイントだけでなく、言語や地域の特定のルールに従って決まる場合にも適切に動作する。
このため、sortメソッドの比較関数を使って単純に辞書順比較(a<b)に置き換えられるものではない。
localeCompareメソッドは挙動が複雑で使いずらいので、私はlocaleCompareメソッドは使用せずに辞書順比較(a<b)を使用することにする。
localeCompareメソッドを使った処理をsortメソッドに書き換えたコードを次に示しておく。
if('A' < 'a'){
console.log("真 " + 'A'.localeCompare('a'));
}else{
console.log("偽 " + 'A'.localeCompare('a'));
}
const m = ['AAA', 'A', 'aa', 'a', 'Aa', 'aaa', 'b', 'bb', 'c', 'cc'];
const m2 = ['AAA', 'A', 'aa', 'a', 'Aa', 'aaa', 'b', 'bb', 'c', 'cc'];
const m3 = ['AAA', 'A', 'aa', 'a', 'Aa', 'aaa', 'b', 'bb', 'c', 'cc'];
console.log("m = "+m);
console.log("m2 = "+m2);
console.log("m3 = "+m3);
m.sort(function (a, b) {
return a.localeCompare(b);
});
m2.sort(function(a, b) {
if(a < b) {
return 1;
}else if(a > b) {
return -1;
}else {
return 0;
}
});
m3.sort(function(a, b) {
if (a.toLowerCase() < b.toLowerCase()) {
return -1;
}else if (a.toLowerCase() > b.toLowerCase()) {
return 1;
}else if(a < b) {
//aの小文字とbの小文字が等しいときかつa<b "a"< "A"か?
return 1;
}else if(a > b) {
//aの小文字とbの小文字が等しいときかつa<b "a" > "A"か?
return -1;
}else {
//aの小文字とbの小文字が等しいときかつa=b
return 0;
}
});
console.log("m.sortの結果:"+m);
console.log("m2.sortの結果:"+m2);
console.log("m3.sortの結果:"+m3);
/*
真 1
m = AAA,A,aa,a,Aa,aaa,b,bb,c,cc
m2 = AAA,A,aa,a,Aa,aaa,b,bb,c,cc
m3 = AAA,A,aa,a,Aa,aaa,b,bb,c,cc
m.sortの結果:a,A,aa,Aa,aaa,AAA,b,bb,c,cc
m2.sortの結果:cc,c,bb,b,aaa,aa,a,Aa,AAA,A
m3.sortの結果:a,A,aa,Aa,aaa,AAA,b,bb,c,cc
*/