🌟

A-1, A-2, A-10, B-1, ... のようにアルファベット順と数値を考慮してくれる比較関数 localeCompare

2023/01/05に公開

業務で学んだ内容についてのメモです。

やりたかったこと

↓ のような文字列の配列を、(ここでの並び順はランダムです)

['A-2', 'A-1', 'B-1', 'B-2', 'A-10']

↓ のようにアルファベット順と数値を考慮した並びにしたい。

['A-1', 'A-2', 'A-10', 'B-1', 'B-2']

できなかったこと

Array.prototype.sort() を実行するだけでは ↓ の並びになってしまいます。

const a = ['A-2', 'A-1', 'B-1', 'B-2', 'A-10']
const b = a.slice().sort()
console.log(b)
// output: ['A-1', 'A-10', 'A-2', 'B-1', 'B-2']

できたこと

Array.prototype.sort() の引数に String.prototype.localeCompare()numeric オプションを有効にしたものを与えることで実現できます。

const a = ['A-2', 'A-1', 'B-1', 'B-2', 'A-10']
const b = a.slice().sort((a, b) => a.localeCompare(b, 'ja', { numeric: true }))
console.log(b)
// output: ['A-1', 'A-2', 'A-10', 'B-1', 'B-2']

まとめ

String.prototype.localeCompare(), めっちゃ便利だな〜って感じたんですけどあまり認知されてなかった (個人的見解) のでそれっぽいタイトルと例を載せて紹介しました。
ありがとうございました。

Discussion