JavaScriptで条件に基づいてオブジェクト配列を並べ替える方法
問題の概要
カードゲームに参加するプレイヤーのスコアを格納した、次のようなオブジェクトの配列があるとします。
const scorecard = [{
name: "Zahir",
score: 23
}, {
name: "Kabir",
score: 13
}, {
name: "Kunal",
score: 29
}, {
name: "Arnav",
score: 42
}, {
name: "Harman",
score: 19
}, {
name: "Rohit",
score: 41
}, {
name: "Rajan",
score: 34
}];さらに、特定のプレイヤーの名前を格納した変数 selfName も用意されています。
const selfName = 'Arnav';
ここで求められているのは、次のような並べ替えを行う関数を作成することです。
- scorecard 配列を名前のアルファベット順に並べ替える
- selfName と同じ名前を持つオブジェクトは必ず先頭(インデックス0)に配置する
それでは、この問題を解決するコードを見ていきましょう。
実装例
ポイントは、Array.prototype.sort() メソッドに渡す比較関数の中で、特定の名前との一致を優先的に判定することです。一致する場合は -1 または 1 を返して先頭へ移動させ、一致しない場合は通常どおり名前を比較します。
const scorecard = [{
name: "Zahir",
score: 23
}, {
name: "Kabir",
score: 13
}, {
name: "Kunal",
score: 29
}, {
name: "Arnav",
score: 42
}, {
name: "Harman",
score: 19
}, {
name: "Rohit",
score: 41
}, {
name: "Rajan",
score: 34
}];
const selfName = 'Arnav';
const sorter = (a, b) => {
if(a.name === selfName){
return -1;
};
if(b.name === selfName){
return 1;
};
return a.name < b.name ? -1 : 1;
};
scorecard.sort(sorter);
console.log(scorecard);コードの解説
比較関数 sorter の動作は以下のとおりです。
- a.name === selfName の場合: a を b より前に配置するため -1 を返し、該当要素が先頭方向へ移動します。
- b.name === selfName の場合: b を a より前に配置するため 1 を返し、該当要素が必ず手前に来ます。
- どちらでもない場合: 名前を辞書順で比較し、a の方が小さければ -1、そうでなければ 1 を返して通常のアルファベット順ソートを行います。
出力結果
コンソールには次のように表示されます。「Arnav」が先頭に移動し、残りの要素がアルファベット順に並んでいることが確認できます。
[
{ name: 'Arnav', score: 42 },
{ name: 'Harman', score: 19 },
{ name: 'Kabir', score: 13 },
{ name: 'Kunal', score: 29 },
{ name: 'Rajan', score: 34 },
{ name: 'Rohit', score: 41 },
{ name: 'Zahir', score: 23 }
]まとめ
このように、sort() メソッドの比較関数内で条件分岐を追加するだけで、「特定の要素を最優先にしつつ、残りを指定した基準で並べ替える」という処理を簡単に実装できます。リーダーボードや検索結果など、自分自身のデータを目立たせたいUIでよく使われるテクニックなので、ぜひ覚えておきましょう。
-
JavaScriptで配列内オブジェクトのプロパティ名を置き換える方法
JavaScriptでオブジェクト配列のプロパティ名を置き換える方法 JavaScriptでは、map()メソッドを活用することで、配列に含まれる各オブジェクトのプロパティ名を別の名前に簡単に置き換えることができます。map()は元の配列を変更せずに新しい配列を生成するため、安全かつ効率的なデータ変換処理に適しています。 以下は、オブジェクト配列のプロパティ名 name を fullName に置き換えるサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta
-
JavaScriptでフラットなオブジェクト配列をツリー構造に変換する方法
はじめにWeb開発では、カテゴリ一覧やフォルダ構成、組織図など、階層構造をもつデータを画面に表示したい場面がよくあります。一方で、データベースやAPIから取得したデータは、idとparentIdを持つフラット(一次元)な配列として渡されることがほとんどです。本記事では、こうしたフラットな配列をもとに、子要素を親オブジェクトへリンクさせたツリー構造を組み立て、ネストされたリスト形式で画面に表示するまでの手順を、HTML・CSSのコード付きでわかりやすく解説します。元データとなるフラットな配列まず、変換対象となるデータを確認しましょう。各オブジェクトは、自身の一意な識別子であるid、表示名のnam