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

JavaScriptでオブジェクトのプロパティを基準に、オブジェクト配列内の一意な要素数を数える方法

JavaScriptでオブジェクトの配列を扱う際、「特定のプロパティに一意な値がいくつ存在するか」を数えたいケースはよくあります。例えば、レストランの注文データを管理する次のようなオブジェクトの配列を考えてみましょう。

const orders = [
    {table_id: 3, food_id: 5},
    {table_id: 4, food_id: 2},
    {table_id: 1, food_id: 6},
    {table_id: 3, food_id: 4},
    {table_id: 4, food_id: 6},
];

この配列には5件の注文データが格納されています。ここで、次の2つの値を求める関数を作成することを考えます。

  • 配列内に存在する一意な table_id の数(つまり、注文が入ったテーブルの数)
  • 配列内に存在する一意な food_id の数(つまり、注文された料理の種類数)

同じテーブルや同じ料理が複数回登場しても、それぞれ1つとしてカウントする点がポイントです。

実装例

一意な値を数えるシンプルな方法のひとつは、オブジェクトをキーの重複防止用のセットとして使うアプローチです。プロパティ値をキーとして格納していけば、同じ値は自動的に上書きされるため、最終的に Object.keys() でキーの数を取得するだけで一意な値の個数がわかります。

const orders = [
    {table_id: 3, food_id: 5},
    {table_id: 4, food_id: 2},
    {table_id: 1, food_id: 6},
    {table_id: 3, food_id: 4},
    {table_id: 4, food_id: 6},
];
const countUniques = (orders = []) => {
    const tableObj = {}, foodObj = {};
    orders.forEach(el => {
        tableObj[el.table_id] = null;
        foodObj[el.food_id] = null;
    });
    const tableUniqueIDs = Object.keys(tableObj).length;
    const foodUniqueIDs = Object.keys(foodObj).length;
    return {
        tableUniqueIDs, foodUniqueIDs
    };
};
console.log(countUniques(orders));

このコードの処理の流れを簡単に整理すると、次のとおりです。

  1. テーブルID用と料理ID用に、それぞれ空のオブジェクトを用意します。
  2. forEach() で配列を走査し、各注文の table_idfood_id をオブジェクトのキーとして登録します。同じ値が再度登場してもキーは上書きされるだけなので、重複は排除されます。
  3. Object.keys().length でそれぞれのキー数(=一意な値の個数)を取得します。
  4. 結果をオブジェクトとして返します。

実行結果

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

{ tableUniqueIDs: 3, foodUniqueIDs: 4 }

この結果から、注文は3つの異なるテーブル(table_id: 1, 3, 4)からのものであり、4種類の異なる料理(food_id: 2, 4, 5, 6)が注文されたことがわかります。

補足:Setを使ったより簡潔な書き方

ES6以降では Set オブジェクトを利用すると、より簡潔に同じ処理を実現できます。

const countUniques = (orders = []) => ({
    tableUniqueIDs: new Set(orders.map(el => el.table_id)).size,
    foodUniqueIDs: new Set(orders.map(el => el.food_id)).size,
});

Set は重複する値を自動的に排除するため、map() でプロパティ値を抽出してから size を参照するだけで、一意な要素数を取得できます。コードの意図も伝わりやすいため、モダンなJavaScript環境ではこちらの書き方が推奨されます。

  1. JavaScriptでオブジェクトの列挙可能なプロパティ値を配列として取得する方法

    JavaScriptでは、Object.keys() や for...in ループなどを使ってオブジェクトからキーや値を取り出すことができますが、これらの方法だけでは値を配列として直接取得することはできません。配列形式のデータは、フィルタリングやマップ処理など、さまざまな場面で非常に便利です。そこで活躍するのが Object.values() メソッドです。このメソッドを使うと、オブジェクトが持つ列挙可能なプロパティの値を要素とする配列を受け取ることができます。構文Object.values(obj);Object.values() は引数としてオブジェクトを受け取り、そのオブジェクトのプロパ

  2. JavaScriptで配列内オブジェクトのプロパティ名を置き換える方法

    JavaScriptでオブジェクト配列のプロパティ名を置き換える方法 JavaScriptでは、map()メソッドを活用することで、配列に含まれる各オブジェクトのプロパティ名を別の名前に簡単に置き換えることができます。map()は元の配列を変更せずに新しい配列を生成するため、安全かつ効率的なデータ変換処理に適しています。 以下は、オブジェクト配列のプロパティ名 name を fullName に置き換えるサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta