localeCompareで配列の内容を五十音順ソート
localeCompare()
使えば半角と全角が混ざってても大丈夫だし、漢字とかも五十音順になる。- 並び順は 記号 → 数字 → 英字 → ひらがな&カタカナ → 漢字。
ざっと使い方
var arr = ['衣', '安', '亜', '印', '愛'];
arr = arr.sort((x, y) => x.localeCompare(y, 'ja'));
console.log(arr);
// -> ["亜", "愛", "安", "衣", "印"]
var arr = ['衣', '安', '亜', '印', '愛'];
arr = arr.sort(function(x, y) {
return x.localeCompare(y, 'ja');
});
console.log(arr);
// -> ["亜", "愛", "安", "衣", "印"]
細かい話
Array
の sort()
を使うと、配列の内容をソートできます。この結果は、デフォルトだと 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
やたら例が長くてすみません。
それで、ずっと五十音順に並べるのは無理だと勘違いしてたんですけど、String
に localeCompare()
というメソッドがあることを知りました。
これ使って 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: "印"
] */
それだけです。さよなら。