JavaScriptでオブジェクトの値をキーにマッピングする方法(逆マッピングの実装)
JavaScriptでは、オブジェクトの「キー」と「値」を入れ替えて新しいオブジェクトを作成したい場面があります。これを逆マッピング(リバースマップ)と呼びます。本記事では、その具体的な実装方法を解説します。
問題の概要
まず、次のようなオブジェクトがあるとします。
const obj = {
'a': 1,
'b': 2,
'c': 3,
'd': 4,
'e': 5,
'f': 6
};このようなオブジェクトを引数として受け取り、値をキーへ、キーを値へと反転させた新しいオブジェクトを返す関数を作成する必要があります。
つまり、上記のオブジェクトの場合、期待される出力は次のようになります。
const output = {
'1': 'a',
'2': 'b',
'3': 'c',
'4': 'd',
'5': 'e',
'6': 'f'
};実装例
以下のコードでは、Object.keys()で元のオブジェクトのすべてのキーを取得し、forEach()で各キーごとに「値を新しいキー、キーを新しい値」として結果オブジェクトに格納しています。
const obj = {
'a': 1,
'b': 2,
'c': 3,
'd': 4,
'e': 5,
'f': 6
};
const reverseMap = (obj = {}) => {
const res = {};
Object.keys(obj).forEach(key => {
const val = obj[key];
res[val] = key;
});
return res;
};
console.log(reverseMap(obj));コードのポイント
- Object.keys(obj):オブジェクトのすべてのキー('a'、'b'…)を配列として取得します。
- forEach(key => {...}):取得した各キーに対して順番に処理を実行します。
- res[val] = key:元の値をキーに、元のキーを値に代入することで、マッピングが反転されます。
出力結果
コンソールには次のように表示されます。
{ '1': 'a', '2': 'b', '3': 'c', '4': 'd', '5': 'e', '6': 'f' }補足:より簡潔な代替手法
reduce()を活用すると、同様の処理をより簡潔に記述できます。
const reverseMap = obj =>
Object.entries(obj).reduce((acc, [key, val]) => {
acc[val] = key;
return acc;
}, {});さらに、モダンな環境ではObject.fromEntries()とmap()を組み合わせたワンライナーも可能です。
const reverseMap = obj =>
Object.fromEntries(
Object.entries(obj).map(([k, v]) => [v, k])
);注意点
元のオブジェクト内に同じ値が複数のキーに対応している場合、後から処理されたキーが最終的な値として残ります。重複が想定されるデータでは、意図した結果にならない可能性があるため注意が必要です。
-
JavaScriptのconst宣言とは?再代入できない変数の基本と使い方を解説
JavaScriptのconst宣言は、値を再代入することも後から再宣言することもできない変数を作成するための構文です。constはES2015(ES6)で導入されました。 const宣言の主な特徴 一度値を代入すると、別の値に再代入することはできません。 同じ名前の変数を同じスコープ内で再宣言するとエラーになります。 宣言時に必ず初期値を代入する必要があります。 ブロックスコープ({}内でのみ有効)を持ちます。 それでは、JavaScriptにおけるconst宣言の実際のコードを見ていきましょう。 サンプルコード <!DOCTYPE html> <html>
-
JavaScriptのconstとletの違いを徹底解説!ブロックスコープ変数の基本と使い方
JavaScriptにおけるconstとletの基本const と let は、ES2015(ES6)で導入された変数宣言用のキーワードです。どちらもブロックスコープ(波括弧 { } で囲まれた範囲)に対応しているのが特徴で、関数スコープしか持たなかった従来の var とは異なる挙動を示します。両者の大きな違いは再代入の可否です。letで宣言した変数は後から何度でも値を再代入できますが、constで宣言した変数は再代入しようとするとエラー(TypeError)が発生します。letとconstの主な違い項目letconst再代入可能不可(エラー発生)スコープブロックスコープブロックスコープ宣言時