はじめに
ソート対象
- オブジェクトの配列
- 第一ソートキー:日本語の値を持つ
name
の昇順 - 第二ソートキー:数字の値を持つ
value
の昇順
- 第一ソートキー:日本語の値を持つ
const array = [
{name: "うえき", value: 2},
{name: "いのうえ", value: 1},
{name: "うえき", value: 1},
{name: "あいかわ", value: 2},
{name: "いのうえ", value: 2},
{name: "あいかわ", value: 1}
];
目標とするソート結果
[
{name: "あいざわ", value: 1},
{name: "あいざわ", value: 2},
{name: "いのうえ", value: 1},
{name: "いのうえ", value: 2},
{name: "うえき", value: 1},
{name: "うえき", value: 2}
]
- 漢字をソートするのは困難であるため、ふりがなでソートしています
作成したコード
array.sort((a, b) => {
const firstKeySortResult = a.name.localeCompare(b.name, 'ja');
if (firstKeySortResult !== 0) {
return firstKeySortResult
} else {
return a.value - b.value; // a < b のとき、-1になり昇順になる
}
});
簡単な解説
- まず
localeCompare
を使用して、name
プロパティでソートします-
name
が同じでない(つまりa.name.localeCompare(b.name, 'ja') !== 0
)ならこのソート結果を返します -
name
が同じなら、value
プロパティでソートした結果を返します
-
別解
- 三項演算子を使って以下のようにも書けます
- @eufss0183様からコメントにてご教示いただきました
array.sort((a, b) => a.name.localeCompare(b.name, 'ja') || a.value - b.value);
簡単な解説
-
a.name.localeCompare(b.name, 'ja')
について、- 0以上か0未満なら
a.name.localeCompare(b.name, 'ja')
の結果が返る - 0なら
false
となりa.value - b.value
の結果が返る
- 0以上か0未満なら
- 「
a.value - b.value
でなんで昇順になるの??」と思った方は以下のページを参考にしてください
おわりに
- ひらがな、カタカナの属性を持たせれば、日本語でもソートできることを知りました
- ソートの基礎知識も再確認でき、良い機会でした