Object.fromEntries()でオブジェクトをmapする

ES2019 から仲間入りする Object.fromEntries() を使うと、オブジェクトの map が以前よりもずっと簡単になる。Node.js では v12 から使えるようになった。

MDN の例を引用する。

const object1 = { a: 1, b: 2, c: 3 };

const object2 = Object.fromEntries(
  Object.entries(object1)
  .map(([ key, val ]) => [ key, val * 2 ])
);

console.log(object2);
// { a: 2, b: 4, c: 6 }

Object.fromEntries() がないときには、ライブラリなしで同じことをするには配列の reduce() メソッドを駆使していた。

const object2 = Object.entries(object1)
  .map(([key, val]) => [ key, val * 2 ])
  .reduce((obj, [key, val]) => ({ ...obj, [key]: val }), {})

ちょっとオブジェクトの値に map したいだけなのに、冗長だ。

とはいっても、上記 2 つの例はどちらも冗長な感じは残る。やはり便利関数を作りたくなる。こんなふうに。

const objectMap = (obj, fun) =>
  Object.fromEntries(Object.entries(obj).map(fun))

んで、こう使う。

const object2 = objectMap(
  object1,
  ([ key, val ]) => [ key, val * 2 ]
)

まあ便利関数を作るのなら結局中の実装はどうでもよくなりますな。

あるいは(2019年4月時点で)stage 1 の不安定なパイプライン演算子を使うと、生のままでも見やすくなるかもしれない。

// たぶんこんな感じ。動くか知らない
const object2 = object1
  |> Object.entries
  |> (entries => entries.map(([ key, val ]) => [ key, val * 2 ]))
  |> Object.fromEntries