JavaScript/String/prototype/localeCompare
String.prototype.localeCompare()
メソッドは、現在の文字列と引数として指定された文字列を現在のロケールに基づいて比較し、両者の並び順を示す数値を返します[1]。
構文
編集str.localeCompare(that[, locales[, options]])
that
: 比較対象の文字列。locales
(省略可能): BCP 47 言語要素の文字列または文字列の配列。使用するロケールを指定します。options
(省略可能): 比較のカスタマイズに使用するオブジェクト。
例
編集基本的な文字列比較のプログラム
編集以下のプログラムは、String.prototype.localeCompare()
を使用して基本的な文字列比較を行います。
// 基本的な比較 console.log('a'.localeCompare('b')); // -1(負の値: 'a' は 'b' より前) console.log('b'.localeCompare('a')); // 1(正の値: 'b' は 'a' より後) console.log('a'.localeCompare('a')); // 0(等しい) // 英語の文字列比較 console.log('apple'.localeCompare('banana')); // 負の値('apple' は 'banana' より前) console.log('banana'.localeCompare('apple')); // 正の値('banana' は 'apple' より後)
このプログラムでは、String.prototype.localeCompare()
を使用して文字列の比較を行っています。返される値は、現在の文字列が比較対象の文字列より前にある場合は負の値、後にある場合は正の値、等しい場合は 0 です。
ロケールを指定した比較のプログラム
編集以下のプログラムは、String.prototype.localeCompare()
を使用して特定のロケールでの文字列比較を行います。
// 異なるロケールでの比較 const germanWord = 'äpfel'; const englishWord = 'zebra'; // デフォルトロケール(実行環境に依存) console.log(germanWord.localeCompare(englishWord)); // ロケールによって結果が異なる // ドイツ語のロケールを指定 console.log(germanWord.localeCompare(englishWord, 'de')); // 負の値(ドイツ語では 'ä' は 'z' より前) // 英語のロケールを指定 console.log(germanWord.localeCompare(englishWord, 'en')); // 負の値(英語でも 'ä' は一般的に 'z' より前) // スウェーデン語のロケールを指定(ここでは 'ä' の扱いが異なる可能性がある) console.log(germanWord.localeCompare(englishWord, 'sv')); // 結果はロケールの実装によって異なる
このプログラムでは、String.prototype.localeCompare()
を使用して異なるロケールでの文字列比較を行っています。ロケールによって特定の文字の並び順が変わる可能性があることを示しています。
照合オプションを使用した比較のプログラム
編集以下のプログラムは、String.prototype.localeCompare()
をさまざまな照合オプションで使用します。
// 大文字小文字を区別しない比較 console.log('a'.localeCompare('A')); // 実装によって結果が異なる console.log('a'.localeCompare('A', undefined, { sensitivity: 'base' })); // 0(大文字小文字を区別しない) // アクセント記号を区別しない比較 console.log('é'.localeCompare('e')); // 実装によって結果が異なる console.log('é'.localeCompare('e', undefined, { sensitivity: 'base' })); // 0(アクセント記号を区別しない) // 数値として比較 console.log('2'.localeCompare('10')); // 正の値(文字列として比較すると '2' は '10' より後) console.log('2'.localeCompare('10', undefined, { numeric: true })); // 負の値(数値として比較すると 2 は 10 より前) // 完全一致で比較 console.log('a'.localeCompare('A', undefined, { sensitivity: 'variant' })); // 非ゼロ(大文字小文字を区別する)
このプログラムでは、String.prototype.localeCompare()
の options
パラメータを使用して、大文字小文字の区別、アクセント記号の区別、数値比較など、さまざまな照合オプションを示しています。
配列のソートに使用するプログラム
編集以下のプログラムは、String.prototype.localeCompare()
を使用して配列を適切にソートします。
// さまざまな言語の文字を含む配列 const items = ['réservé', 'premier', 'communiqué', 'café', 'adieu', 'éclair']; // デフォルトのソート(予期しない結果になる可能性がある) console.log(items.sort()); // localeCompare を使用したソート console.log(items.sort((a, b) => a.localeCompare(b, 'fr'))); // 数値を含む配列 const numbers = ['1', '10', '2', '21']; // デフォルトのソート(文字列として比較) console.log(numbers.sort()); // ['1', '10', '2', '21'] // localeCompare を使用した数値ソート console.log(numbers.sort((a, b) => a.localeCompare(b, undefined, { numeric: true }))); // ['1', '2', '10', '21']
このプログラムでは、String.prototype.localeCompare()
を使用して文字列の配列をロケールに基づいてソートしています。また、数値文字列を含む配列を数値として正しくソートする方法も示しています。
注意点
編集- 戻り値: 返される値は負の値、0、または正の値ですが、具体的な値は実装によって異なります。
- ロケール依存: 結果はロケールに依存するため、異なる環境で異なる結果が得られる可能性があります。
- オプション:
options
パラメータを使用すると、比較の動作をカスタマイズできます。主なオプションには以下があります。
*sensitivity
: 大文字小文字やアクセント記号の区別方法を指定します('base', 'accent', 'case', 'variant')。 *numeric
: 文字列内の数値を数値として比較するかどうかを指定します。 *ignorePunctuation
: 句読点を無視するかどうかを指定します。 *caseFirst
: 大文字と小文字のどちらを先にソートするかを指定します('upper', 'lower', 'false')。
- パフォーマンス: 大量のテキストを比較する場合、
Intl.Collator
を使用する方が効率的です。 - 互換性:
locales
とoptions
パラメータは一部のブラウザでサポートされていない可能性があります。
脚註
編集- ^ このメソッドは、言語固有の文字列比較を行うために使用されます。
外部リンク
編集- ECMA-262::22.1.3.12 String.prototype.localeCompare ( that [ , reserved1 [ , reserved2 ] )]
- MDN Web Docs: String.prototype.localeCompare()