JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでプロパティの有無に基づいてオブジェクト配列を並べ替える方法

JavaScriptでは、オブジェクトが特定のプロパティを持っているかどうかに基づいて配列を並べ替えたいケースがあります。ここでは、次のような人物データのオブジェクト配列を例に、その実装方法を解説します。

const people = [{
  firstName: 'Ram',
  id: 301
}, {
  firstName: 'Shyam',
  lastName: 'Singh',
  id: 1016
}, {
  firstName: 'Dinesh',
  lastName: 'Lamba',
  id: 231
}, {
  id: 341
}, {
  firstName: 'Karan',
  lastName: 'Malhotra',
  id: 441
}, {
  id: 8881
}, {
  firstName: 'Vivek',
  id: 301
}];

実現したい並べ替えルール

この配列を、以下の優先順位で並べ替えることが目的です。

  • firstName と lastName の両方を持つオブジェクトを先頭に配置する
  • firstName または lastName のどちらか一方だけを持つオブジェクトをその後に配置する
  • どちらのプロパティも持たないオブジェクトを最後に配置する

実装例

最もシンプルで確実なのは、各オブジェクトの「プロパティの所持状況」を 0〜2 の優先度(ランク)に変換し、その差で比較する方法です。

const people = [
  // ... 上記のサンプルデータ ...
];

// プロパティの所持状況に応じて優先度を返す
const getRank = (person) => {
  const hasFirst = person.firstName !== undefined;
  const hasLast = person.lastName !== undefined;

  if (hasFirst && hasLast) {
    return 0; // 両方ある → 最も優先
  } else if (hasFirst || hasLast) {
    return 1; // どちらか一方のみ
  }
  return 2; // どちらもない → 最後
};

// 優先度の差をもとに並べ替える
people.sort((a, b) => getRank(a) - getRank(b));

console.log(people);

コードのポイント

  • getRank 関数は、プロパティの組み合わせに応じて 0・1・2 の数値を返します。数値が小さいほど先頭に配置されます。
  • Array.prototype.sort() の比較関数は、負の値を返すと a が先、正の値を返すと b が先に来ます。ここでは優先度の差をそのまま返すことで意図した順序を実現しています。
  • ES2019 以降の仕様では sort() は安定ソートと定められているため、同じ優先度の要素同士は元の配列での相対的な順序が維持されます。

実行結果

コンソールには次のように出力されます。

[
  { firstName: 'Shyam', lastName: 'Singh', id: 1016 },
  { firstName: 'Dinesh', lastName: 'Lamba', id: 231 },
  { firstName: 'Karan', lastName: 'Malhotra', id: 441 },
  { firstName: 'Ram', id: 301 },
  { firstName: 'Vivek', id: 301 },
  { id: 341 },
  { id: 8881 }
]

このように「プロパティの有無」を単一の数値(優先度)へマッピングすると、条件分岐が多くなりがちな比較関数をすっきり整理でき、読みやすくバグの少ないソート処理になります。入力済みの必須項目を持つレコードを優先的に表示したい場合など、実務のさまざまな場面で応用できるテクニックです。

  1. JavaScriptのlengthプロパティで配列オブジェクトの長さを取得する方法

    JavaScriptにおけるlengthプロパティとはJavaScriptのlengthプロパティは、文字列や配列などのオブジェクトが持つ要素数(サイズ)を返すために使用されます。配列の場合は格納されている要素の個数、文字列の場合は文字数を取得できます。ここでは、文字列と配列オブジェクトの長さをlengthプロパティで取得するサンプルコードを紹介します。サンプルコード以下の例では、ボタンをクリックすると配列の長さが画面に表示される仕組みを実装しています。<!DOCTYPE html> <html lang="ja"> <head> <

  2. JavaScriptのArray.prototype.sort()メソッドの使い方をサンプルコードで解説

    Array.prototype.sort()は、JavaScriptで配列の要素を並べ替えるための組み込みメソッドです。アルファベット順・数値順といった並び方に加えて、昇順・降順も自由に指定でき、配列操作の中でも特に使用頻度の高いメソッドの一つです。 ただし重要なポイントとして、sort()メソッドはデフォルトではすべての要素を文字列に変換してから比較します。そのため、数値の配列を意図したとおりに並べ替えたい場合は、比較関数を引数として渡す必要があります。 以下は、Array.prototype.sort()メソッドの基本的な使い方を示すサンプルコードです。 サンプルコード <!DOC