【JavaScript】localeCompareメソッドとsortメソッド

  • このエントリーをはてなブックマークに追加

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

*/
  • このエントリーをはてなブックマークに追加

SNSでもご購読できます。

コメントを残す

*