JavaScript

String.prototype.localeCompare()メソッド

 編集:2022.08.16 by T.A.

その String と文字列 compareString とを、並べ替え順において前後関係を数値で返します。

新しい locales と options 引数によってアプリケーションはソート順で使われる言語を指定し関数の振る舞いをカスタマイズできます。古い実装では、locales 引数と options 引数は無視されます。使用されるローケルとソート順は完全に実装依存しています。

number=referenceStr.localeCompare(compareString[, locales[, options]] )
referenceStr String。
compareString referenceStr と比較される文字列。
localesoptions これらの引数は関数の振る舞いをカスタマイズし、使用されるべきフォーマット規約の言語をアプリケーションに決めさせます。

引数 locales 、 options を無視する実装においては、使用されるロケールと返却される文字列の書式は完全に実装依存となります。

これらのパラメーターの詳細及び使用方法については Intl.Collator() コンストラクター を見てください。

戻り値

Number。文字コード的に¶、referenceStrcompareString より前に出現する場合は負数、referenceStrcompareString より後に出現する場合は正数、等しい場合は 0 。

解説

referenceStrcompareString より辞書順で先に来るか、後に来るか、あるいは等しいかを示す整数を返します。

戻り値が厳密に -1 や 1 であると考えないように

負数と正数が結果としてどんな数値になるかはブラウザー間(及びブラウザーのバージョン間)で異なります。これは W3C の仕様が負の値か正の値かとだけ指定しているためです。ブラウザーによっては -2 や 2 を、あるいはまた別の負の値、正の値を返却するかもしれません。

パフォーマンス

巨大な配列のソートなど大量の文字列を比較する場合は Intl.Collator オブジェクトを作成し、compare プロパティで提供される関数を利用すると良いでしょう。

// 文字 "a" は "c" は負数になります
D='a'.localeCompare('c'); //=-1。-2 や -1、あるいはまた別の負数。

// 単語 "check" はアルファベット順に "against" より後ろなので正数になります。
D='check'.localeCompare('against'); //=1。2 や -1、あるいはまた別の正数。

// "a" と"a" は等しいので自然数 0 になります。
D='a'.localeCompare('a'); //=0
配列のソート

localeCompare() は case-insensitive な配列のソートを行います。

let items = ['réservé', 'Premier', 'Cliché', 'communiqué', 'café', 'Adieu'];
D=items.sort( (a, b) => a.localeCompare(b, 'fr', {ignorePunctuation: true}));
//=['Adieu', 'café', 'Cliché', 'communiqué', 'Premier', 'réservé']
拡張された引数をブラウザーがサポートしているか調べる

引数 locales と options はすべてのプラウザでまだサポートされていません。

実装がこれらをサポートしているか調べるため引数 "i" (不正な言語タグが除外される要件)を利用し、例外 RangeError を調べます。

function localeCompareSupportsLocales() {
  try {
    'a'.localeCompare​('b', 'i');
  } catch (e) {
    return e​.name === 'RangeError';
  }
  return false;
}

localesを使う

localeCompare()によって得られる結果は言語間で違います。アプリケーションのユーザインターフェイスで使用される言語のソート順を得るために、locales 引数を使用してその言語(そしておそらくいくつかのフォールバック言語)を指定していることを確かめて下さい:

D='ä'.localeCompare('z', 'de'); //=-1。負数: ドイツ語で ä は a に分類される。
D='ä'.localeCompare('z', 'sv'); //=1。正数: スウェーデン語では ä は z の後になる
optionsを使う

localeCompare()によって得られる結果はoptions引数を使用することによってカスタマイズできます:

// ドイツ語では ä の base letter は a
D='ä'.localeCompare('a', 'de', { sensitivity: 'base' }); //=0

// スウェーデン語では ä と a は異なる base letters
D='ä'.localeCompare('a', 'sv', { sensitivity: 'base' }); //=1。正の値。
数字のソート
// デフォルトでは "2" > "10"
D="2".localeCompare("10"); //=1

// オプションを使った数字
D="2".localeCompare("10", undefined, {numeric: true}); //=-1

// ロケールタグを使った数字
D="2".localeCompare("10", "en-u-kn-true"); //=-1

テスト