Array.prototype.reduce() に親しむ

JavaScript の配列に reduce という関数がある。 MDM のドキュメント によると以下のように書かれている。

arrayObj.reduce(function(previousValue, currentValue, index, array){
  // ...
})

previous とか current いわれてもよくわからん。。 ただ、感覚を掴んでくるとこいつがなかなか便利だ。

たとえば、配列をループの中で処理する場合、そのままだと二重ループになっちゃって計算量がかさむってことがある。なので事前に配列じゃなくて連想配列だと嬉しい。そんなとき、こいつを使うと配列を連想配列に変換することができる。

array.reduce((map, obj) => {
  map(obj.key) = obj;
  return map;
}, {});

また Object.assign() とも相性がいい。これは、第一引数のオブジェクトに第二引数のオブジェクトをくっつけることができるというものだ。なので、たとえばオブジェクトの配列

const array = [
  {
    "1" : {
      ...
    },
  }
  {
    "2" : {
      ...
    }
  }
]

を使って

const result = array.reduce((map, obj) => {
  Object.assign(map, obj);
}, {});

すると、

result = {
  "hoge" : {
    ...
  },
  "fuga" : {
    ...
  }
}

のように変換できる。たとえば Node.js でデータを配列として取得して、 key-value として扱いたいってときに超便利。