ささみろぐ

チラシの裏

【JavaScript】reduceで配列から辞書を作る【爆速】

JSで配列を加工して辞書オブジェクトを作りたいときに詰まったのでメモ

ここに書いてあることがやりたい

JavaScript: Map an array of objects to a dictionary - DEV Community

つまり、配列

[
  {id: 1, country: 'Germany', population: 83623528},
  {id: 2, country: 'Austria', population: 8975552},
  {id: 3, country: 'Switzerland', population: 8616571}
]

から、それぞれの要素を加工してkey-valueにしたオブジェクト

{1: "Germany", 2: "Austria", 3: "Switzerland"}

に変換するようなことがやりたいとき、上記サイトに書いてある方法

let dictionary = data.reduce(
       (a,x) => ({...a, [x.id]: x.country}), {}
)

を使うと実現できる。

しかし、毎回新しいオブジェクトを再生成するため、配列のサイズが大きくなると爆発的に遅くなる。 *1

そこで、オブジェクトを再生成せず利用し続けるようにすると、劇的に速くなる。 *2

let dictionary = data.reduce(
    (a,x) => {
        a[x.id] = x.country
        return a
    }, {}
)

*1:サイズkのオブジェクトを作るたびにkに比例する時間でのメモリ確保処理をする。サイズnの配列についてk=1からk=nまで足すとO(n2)かかる。

*2:O(n)で済む。