【lodash】memoizeのデフォルトキャッシュキーは対象関数の第一引数のみ!第二引数以降も対象としたい場合は?

lodashのmemoizeで引っかかったので、メモ残し。

目次

resolver?

問題なく動いていたのに、急にキャッシュが効かないように

いろいろ調べていたところ、以下の記事でresolverに関する記述が

キャッシュキーをカスタムできるようですが、何のためにあるんだ?

そういえば、キャッシュが効かないコードは、対象の関数の引数が2つだったような…

もしや!?

memoizeのキャッシュキーは、デフォルトだとメモ化の対象となる関数の第一引数のみ

lodash公式ドキュメントのmemoize解説をチェックしたところ、以下のような記述が

By default, the first argument provided to the memoized function is used as the map cache key.

まじっすか…引数全部が対象じゃないんだ…

memoizeのキャッシュキーは、デフォルトだとメモ化の対象となる関数の第一引数のみっぽいです。

第二引数以降もキャッシュキーの対象としたい場合

第二引数以降もキャッシュキーの対象としたい場合は、memoizeの第二引数(resolver)で対象となるように調整する必要があります。

例えば、3つの引数を対象としたいような場合は以下のような感じで

const sum = _.memoize(
  (a, b, c) => a + b + c,
  (a, b, c) => [a, b, c]
)

resolverの部分は配列にしていますが、一意になればオブジェクトでも文字列でも問題ないと思います。

resolverを使えば、外部からの変数もキーにできそうです。

使いどころがあるかは不明ですが(´▽`;)