【JavaScript】複数のキー条件に一致するオブジェクトの件数をカウントする方法
JavaScriptでは、オブジェクトの配列から特定の条件に一致する要素だけを抽出し、その件数をカウントしたいケースがよくあります。例えば、次のようなオブジェクトの配列があったとします。
const arr = [
{"goods":"Wheat", "from":"GHANA", "to":"AUSTRALIA"},
{"goods":"Wheat", "from":"USA", "to":"INDIA"},
{"goods":"Wheat", "from":"SINGAPORE", "to":"MALAYSIA"},
{"goods":"Wheat", "from":"USA", "to":"INDIA"},
];この配列に対して、「from」プロパティが「USA」、「to」プロパティが「INDIA」という2つの条件を同時に満たすオブジェクトだけを取り出し、その個数を返す関数を作成することを目標とします。
実装方法
このような処理には、Array.prototype.filter()メソッドを使うのが最もシンプルです。filter()はコールバック関数がtrueを返した要素のみを集めた新しい配列を作成するため、その結果のlengthプロパティを参照すれば、条件に一致する件数がわかります。
コード例
const arr = [
{"goods":"Wheat", "from":"GHANA", "to":"AUSTRALIA"},
{"goods":"Wheat", "from":"USA", "to":"INDIA"},
{"goods":"Wheat", "from":"SINGAPORE", "to":"MALAYSIA"},
{"goods":"Wheat", "from":"USA", "to":"INDIA"},
];
const findDesiredLength = (arr = [], from = 'USA', to = 'INDIA') => {
const filtered = arr.filter(el => {
if(el.from === from && el.to === to){
return true;
}
});
const { length: l } = filtered || [];
return l;
};
console.log(findDesiredLength(arr));実行結果
このコードをコンソールで実行すると、以下の出力が得られます。
2
コードの解説
ここでは、findDesiredLengthというアロー関数を定義しています。引数には対象の配列arr、検索したい出発地from、到着地toを受け取ります。デフォルト値として'USA'と'INDIA'を設定しているため、引数を省略して呼び出すことも可能です。
filter()メソッドのコールバック内では、論理AND演算子(&&)を使って「el.from === from && el.to === to」という条件式を評価しています。これにより、両方のプロパティが指定した値と完全一致するオブジェクトだけが、新しい配列filteredに残ります。
最後に、分割代入を使ってfiltered配列のlengthプロパティを変数lとして取得し、それを返しています。条件に一致するオブジェクトは2つ存在するため、結果として「2」が出力されるわけです。
より簡潔な書き方
if文を省略し、比較結果を直接返すようにすれば、さらに短く書くこともできます。
const findDesiredLength = (arr = [], from = 'USA', to = 'INDIA') =>
arr.filter(el => el.from === from && el.to === to).length;また、中間配列を生成せずにカウントだけが必要な場合は、reduce()やfor...ofループを使うことで、メモリ効率を改善することもできます。
まとめ
- 複数のキー・値のペアでオブジェクトを絞り込むには、filter()メソッドと論理AND演算子(&&)を組み合わせる。
- 条件に一致する要素の件数は、フィルタリング後の配列のlengthプロパティで取得できる。
- デフォルト引数を使うと、関数呼び出し時の柔軟性が高まる。
このテクニックは、APIレスポンスのデータ集計や、特定の条件に合致するレコード数の表示など、実務でも頻繁に活用される基本的なパターンです。ぜひマスターしておきましょう。
-
JavaScriptでNumberオブジェクトを作成する方法をわかりやすく解説
Numberオブジェクトとは JavaScriptのNumberオブジェクトは、整数や浮動小数点数などの数値データを表すラッパーオブジェクトです。プリミティブな数値に対して各種プロパティやメソッドを利用できるようにする役割を持ちます。 Numberオブジェクトの作成方法 Numberオブジェクトを作成するには、次のような構文を使用します。 var val = new Number(number); ここで重要なポイントがひとつあります。new演算子を付けずにNumber()を呼び出した場合は、オブジェクトを生成するのではなく、引数を数値へ変換する型変換(キャスト)として機能します。たとえ
-
JavaScriptのObject.keys().map()とArray.map()の違いを徹底解説
JavaScriptにおいて、Array.map()は配列の各要素に関数を適用し、その結果を新しい配列として返すメソッドです。一方、オブジェクトには直接map()メソッドが用意されていないため、Object.keys().map()という形で、まずObject.keys()を使ってオブジェクトのキーを配列として取得し、そこにmap()を適用するのが一般的なテクニックとなります。 この記事では、両者の使い方の違いを、実際に動作するサンプルコードと実行結果をもとにわかりやすく解説します。 サンプルコード 以下は、Object.keys().map()とArray.map()の動作を比較できるJa