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

JavaScriptでオブジェクトを逆マッピングして値からキーを取得する方法

JavaScriptでは、オブジェクトの「値」から対応する「キー」を逆引きしたい場面があります。本記事では、逆マッピング(リバースマッピング)を使って、値からキーを効率的に取得する方法を解説します。

前提となるオブジェクト

まず、次のようなオブジェクトを想定します。

const products = {
    "Pineapple": 38,
    "Apple": 110,
    "Pear": 109
};

このオブジェクトでは、すべてのキーが互いに重複せず、すべての値も互いにユニークであるとします。

実現したいこと

ここで、「値を受け取り、その値に対応するキーを返す関数」を作成することを目標とします。仮にこの関数を findKey() と呼びましょう。

たとえば、findKey(110) を実行すると "Apple" が返される、というイメージです。

アプローチ:逆マッピングによる解決

この問題に対しては、まず元のオブジェクトの「値をキーに、キーを値に」入れ替えた逆マッピング用のオブジェクトを生成し、その後、通常のオブジェクト記法で目的の値に対応するキーを参照する方法が有効です。

コード例

実際のコードは以下のようになります。

const products = {
    "Pineapple": 38,
    "Apple": 110,
    "Pear": 109
};

const findKey = (obj, val) => {
    const res = {};
    // 元のオブジェクトを走査し、値をキー・キーを値として入れ替える
    Object.keys(obj).map(key => {
        res[obj[key]] = key;
    });
    // 指定された値がオブジェクトに存在しない場合は false を返す
    return res[val] || false;
};

console.log(findKey(products, 110));

実行結果

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

Apple

コードのポイント

  • Object.keys():オブジェクトのすべてのキーを配列として取得し、map() で順番に処理しています。
  • 逆マッピングの生成:res[obj[key]] = key; の一行で、値とキーの役割を入れ替えた新しいオブジェクトを作成できます。
  • 存在しない値への対応:該当する値が見つからない場合には false を返すため、呼び出し側で安全に判定できます。

なお、値が 0 や空文字列など falsy な値になる可能性がある場合は、res[val] || false の代わりに val in res ? res[val] : false と書くと、より厳密に判定できます。

  1. JavaScriptのRegExp(正規表現)オブジェクトとは?基本の使い方をわかりやすく解説

    RegExp(正規表現)オブジェクトは、テキストに対してパターンマッチングを行い、目的の文字列部分を検索・抽出するために使用されます。JavaScriptでは、RegExpオブジェクトを「RegExpコンストラクタ」または「リテラル構文」の2通りの方法で作成できます。 RegExpオブジェクトの作成方法 コンストラクタを使用する場合: new RegExp(pattern) リテラル構文を使用する場合: /pattern/ 主なメソッド test():文字列がパターンに一致するかどうかを真偽値(true / false)で返します。 exec():パターンに一致した文字列を返します。

  2. JavaScriptのオブジェクト初期化子とは?使い方をサンプルコードで解説

    オブジェクト初期化子とは オブジェクト初期化子(Object Initializer)は、新しく生成したオブジェクトを初期化するための式です。波括弧 {} の中に、「プロパティ名」と「それに対応する値」のペアを0個以上、カンマ区切りで列挙して記述します。 これにより、変数宣言と同時にオブジェクトの中身を簡単に定義することができます。 以下は、JavaScriptでオブジェクト初期化子を使用したサンプルコードです。 サンプルコード <!DOCTYPE html> <html lang="en"> <head> <meta chars