Cerchiamo di capire come funziona _.memoize
, ci vuole una funzione che deve essere memoized come primo argomento e memorizza nella cache il risultato del ritorno funzione per il dato parametro. La prossima volta, se la funzione memoized viene richiamata con lo stesso argomento, utilizzerà il risultato memorizzato nella cache e il tempo di esecuzione della funzione può essere evitato. Quindi è molto importante ridurre il tempo di calcolo.
Come accennato, la funzione fibonaci di cui sopra memoized funziona perfettamente bene come l'argomento ha un tipo primitivo.
Il problema si verifica quando è necessario memoizzare una funzione che accetta un oggetto. Per risolvere questo, _.memoize
accetta un argomento facoltativo hashFunction
che verrà utilizzato per cancellare l'input. In questo modo puoi identificare in modo univoco i tuoi oggetti con le tue funzioni hash.
L'implementazione predefinita di _.memoize
(utilizzando la funzione di hash predefinita) restituisce il primo argomento così com'è: nel caso di JavaScript restituirà [Object object]
.
Quindi per es.
var fn = function (obj){ some computation here..}
var memoizedFn = _.memoize(fn);
memoizedFn({"id":"1"}) // we will get result, and result is cahced now
memoizedFn({"id":"2"}) // we will get cached result which is wrong
perché l'impostazione predefinita ha la funzione in _.Memoize è la funzione (x) {return x}
il problema può essere evitato facendo passare una funzione di hash
_.memoize(fn, function(input){return JSON.stringify(input)});
Questo è stato un vero e proprio aiuto per me quando ero utilizzando _.memoize per una funzione che era lavorando sugli argomenti degli array.
Spero che questo aiuti molte persone nel loro lavoro.
fonte
2015-03-13 11:35:55
Risolti alcuni errori di grammatica e aggiunte alcune informazioni aggiuntive. –