こうこく
作 ▸
改 ▸

localeCompareで配列の内容を五十音順ソート

  • localeCompare() 使えば半角と全角が混ざってても大丈夫だし、漢字とかも五十音順になる。
  • 並び順は 記号 → 数字 → 英字 → ひらがな&カタカナ → 漢字。

ざっと使い方

アロー演算子
var arr = ['衣', '安', '亜', '印', '愛'];
arr = arr.sort((x, y) => x.localeCompare(y, 'ja'));

console.log(arr);
// -> ["亜", "愛", "安", "衣", "印"]
function版
var arr = ['衣', '安', '亜', '印', '愛'];
arr = arr.sort(function(x, y) {
	return x.localeCompare(y, 'ja');
});

console.log(arr);
// -> ["亜", "愛", "安", "衣", "印"]

細かい話

Arraysort() を使うと、配列の内容をソートできます。この結果は、デフォルトだと String 型にキャストした結果でUTF-16コード順にソートされるので、五十音順ではないです。

デフォルト順ソート
console.log([
	'0', '1', '00', '01', '10', '11',
	'1', '0', '00', '01', '10', '11',
	'!', '!', '_', '_', 'A', 'a', 'á', 'B', 'b', 'A', 'a', 'B', 'b',
	'あ', 'ぁ', 'い', 'ぃ', 'ア', 'ァ', 'イ', 'ィ', 'ア', 'ァ', 'イ', 'ィ',
	'亜', '阿', '愛', '安', '衣', '印', '🐤', '🍆', '🍅'
].sort());
/* -> [
	0: "!"
	1: "0"
	2: "00"
	3: "01"
	4: "1"
	5: "10"
	6: "11"
	7: "A"
	8: "B"
	9: "_"
	10: "a"
	11: "b"
	12: "á"
	13: "ぁ"
	14: "あ"
	15: "ぃ"
	16: "い"
	17: "ァ"
	18: "ア"
	19: "ィ"
	20: "イ"
	21: "亜"
	22: "印"
	23: "安"
	24: "愛"
	25: "衣"
	26: "阿"
	27: "🍅"
	28: "🍆"
	29: "🐤"
	30: "!"
	31: "0"
	32: "00"
	33: "01"
	34: "1"
	35: "10"
	36: "11"
	37: "A"
	38: "B"
	39: "_"
	40: "a"
	41: "b"
	42: "ァ"
	43: "ィ"
	44: "ア"
	45: "イ"
] */

// 備考:絵文字は文字コード順で🍅→🍆→🐤です。
console.log('🍅'.charCodeAt(0), '🍅'.charCodeAt(1)); // -> 55356 57157
console.log('🍆'.charCodeAt(0), '🍆'.charCodeAt(1)); // -> 55356 57158
console.log('🐤'.charCodeAt(0), '🐤'.charCodeAt(1)); // -> 55357 56356

やたら例が長くてすみません。

それで、ずっと五十音順に並べるのは無理だと勘違いしてたんですけど、StringlocaleCompare() というメソッドがあることを知りました。

これ使って sort() すると、普通に五十音順にソートできるんですね。

五十音順ソート
// 配列はさっきと同じ
console.log([
	'0', '1', '00', '01', '10', '11',
	'1', '0', '00', '01', '10', '11',
	'!', '!', '_', '_', 'A', 'a', 'á', 'B', 'b', 'A', 'a', 'B', 'b',
	'あ', 'ぁ', 'い', 'ぃ', 'ア', 'ァ', 'イ', 'ィ', 'ア', 'ァ', 'イ', 'ィ',
	'亜', '阿', '愛', '安', '衣', '印', '🐤', '🍆', '🍅'
].sort((x, y) => x.localeCompare(y, 'ja')));
/* -> [
	0: "_"
	1: "_"
	2: "!"
	3: "!"
	4: "🍅"
	5: "🍆"
	6: "🐤"
	7: "0"
	8: "0"
	9: "00"
	10: "00"
	11: "01"
	12: "01"
	13: "1"
	14: "1"
	15: "10"
	16: "10"
	17: "11"
	18: "11"
	19: "a"
	20: "a"
	21: "A"
	22: "A"
	23: "á"
	24: "b"
	25: "b"
	26: "B"
	27: "B"
	28: "ぁ"
	29: "ァ"
	30: "ァ"
	31: "あ"
	32: "ア"
	33: "ア"
	34: "ぃ"
	35: "ィ"
	36: "ィ"
	37: "い"
	38: "イ"
	39: "イ"
	40: "亜"
	41: "阿"
	42: "愛"
	43: "安"
	44: "衣"
	45: "印"
] */

それだけです。さよなら。

この記事に何かあればこちらまで (非公開)