【JavaScript】配列のreduce関数の可読性を少し上げるテクニック

JavaScript の話題です。配列の reduce 関数、書きやすいけど可読性が低いですよね。

たとえば以下のようにコレクションを変換して id をキーとしたオブジェクトにするという操作。慣れてくれば普通に読めますけど、なんとなく読みにくいんですよね。

const users = [
  {id: 1, name: 'suzuki'},
  {id: 2, name: 'sato'},
  {id: 3, name: 'shimizu'}
]

const usersById = users.reduce(
  (obj, user) => Object.assign(obj, {[user.id]: user}),
  {}
)

問題は、reduce 関数の中にロジックを詰め込んでいることにあります。そこで、ロジックを分離してみましょう。

上記の reduce の中で行っていることは、

  1. user をオブジェクト {[user.id]: user} にする
  2. 各オブジェクトを結合して一つのオブジェクトにまとめる

という二つの操作に分離できます。それらを分けて書くと、以下のようになります。

const usersById = users
 .map(
    (user) => ({[user.id]: user})
  ).reduce(
    (obj, userObj) => Object.assign(obj, userObj),
    {}
  )

少しは可読性が上がりました。 reduce の前に map で下処理をすると良さそうです。