JavaScript でオブジェクトの map 関数を作成する

Alex Dulcianu 2023年10月12日
  1. JavaScript で一般的な map() メソッドを使用してオブジェクトの map 関数を作成する
  2. JavaScript で for in ループを使用してオブジェクトの map 関数を作成する
  3. JavaScript のオブジェクトのカスタム map 関数を使用して新しいオブジェクトを作成する
  4. JavaScript で Object.entries() および Object.fromEntries() を使用してオブジェクトの map 関数を作成する
  5. Object.entries()Object.fromEntries() を使用して関数を記述し、JavaScript でオブジェクトを map する
JavaScript でオブジェクトの map 関数を作成する

JavaScript のオブジェクトに対して特定の操作を実行したい場合が多くあります。標準ライブラリには、これを実現するためのあらゆる種類のメソッドが含まれていますが、すべてのケースが網羅されているわけではありません。

この場合、オブジェクトの属性を反復処理して、Array.prototype.map 関数と同様のアクションを実行するネイティブな方法はありません。

したがって、各属性を調べて特定の値を追加する場合、標準のライブラリメソッドを使用してそれを行う方法はありません。ありがたいことに、map 関数を最初から作成し、必要に応じてカスタマイズすることができます。

JavaScript で一般的な map() メソッドを使用してオブジェクトの map 関数を作成する

このメソッドは、ネイティブの map() 関数を使用して、目的の結果を得ることができます。ただし、このメソッドは新しいオブジェクトを作成するのではなく、元のオブジェクトを変更することを知っておく必要があります。

元のオブジェクトを気にせず、結果が必要な場合は、次の方法でこれを実現できます。

let testObject = {'first': 1, 'second': 2, 'third': 3};

Object.keys(testObject).map(function(key, value) {
  testObject[key] += 1
});

console.log(testObject);

出力:

{ first: 2, second: 3, third: 4 }

JavaScript で for in ループを使用してオブジェクトの map 関数を作成する

または、単純な for ループを使用して、オブジェクトの属性を反復処理し、目的の計算を実行することもできます。このメソッドは、hasOwnProperty() 関数を使用して、オブジェクトに有効な属性があるかどうかを確認します。

let testObject = {'first': 1, 'second': 2, 'third': 3};

for (var key in testObject) {
  if (testObject.hasOwnProperty(key)) {
    testObject[key] += 1;
  }
}

console.log(testObject);

出力:

{ first: 2, second: 3, third: 4 }

JavaScript のオブジェクトのカスタム map 関数を使用して新しいオブジェクトを作成する

上記のように、前のメソッドは、目的の操作を実行しながら元のオブジェクトを上書きします。それを望まない場合は、代わりに新しいオブジェクトを作成し、元のオブジェクトをそのまま保持することができます。

明らかに、このメソッドはより多くのコードを必要としますが、結果は少しきれいになります。

let testObject = {'first': 1, 'second': 2, 'third': 3};

function customMap(object, mapFn) {
  return Object.keys(object).reduce(function(result, key) {
    result[key] = mapFn(object[key])
    return result
  }, {});
}

let newObject = customMap(testObject, function(value) {
  return value + 1
});

console.log(testObject);
console.log(newObject);

出力:

{ first: 1, second: 2, third: 3 }
{ first: 2, second: 3, third: 4 }

出力には、元のオブジェクトと、値が変更された新しく作成されたオブジェクトが表示されます。興味があれば、使用した mapFn パラメーターは Array.from() メソッドの一部であり、マッピング関数として機能するように設計されています。

JavaScript で Object.entries() および Object.fromEntries() を使用してオブジェクトの map 関数を作成する

プロジェクトで下位互換性を気にせずに ES2019 標準を使用できる場合は、マッピング関数の作成に必要なコードを減らすことができます。

このメソッドのコードは次のようになります。

let testObject = {'first': 1, 'second': 2, 'third': 3};

let newObject = Object.fromEntries(
    Object.entries(testObject).map(([key, value]) => [key, value + 1]));

console.log(testObject);
console.log(newObject);

出力:

{ first: 1, second: 2, third: 3 }
{ first: 2, second: 3, third: 4 }

これはワンライナーであるため、実装は少し簡単ですが、保守が難しい場合があります。

Object.entries()Object.fromEntries() を使用して関数を記述し、JavaScript でオブジェクトを map する

上記のコードをより管理しやすく、保守しやすくしたいとします。その場合、最も簡単な解決策は、Object.entries()Object.fromEntries() をカスタム関数に統合することです。

そのため、前のコードを書き直す方法は次のとおりです。

let testObject = {'first': 1, 'second': 2, 'third': 3};

function customMap(object, func) {
  return Object.fromEntries(
      Object.entries(object).map(([key, value]) => [key, func(value)]));
}

let newObject = customMap(testObject, (x) => x + 1);

console.log(testObject);
console.log(newObject);

出力:

{ first: 1, second: 2, third: 3 }
{ first: 2, second: 3, third: 4 }

関連記事 - JavaScript Map