Sommario: Esiste un modo più veloce per gli oggetti hash rispetto a JSON.stringify
?Memoizzazione efficiente degli argomenti dell'oggetto
Dettagli: Ho una libreria Ruby e JavaScript (NeatJSON) che fornisce una buona stampa dei valori JavaScript. Recentemente ho risolto un problema in cui oggetti profondamente nidificati causavano prestazioni O (n!) (n come livello di nidificazione) utilizzando la memoizzazione in base all'oggetto serializzato e all'importo dell'indentazione.
In Ruby, the fix stato davvero facile, perché si può hash indice di array di gruppi unici di oggetti:
build = ->(object,indent) do
memoizer[[object,indent]] ||= <all the rest of the code>
end
in JavaScript, tuttavia, non possono indicizzare un oggetto da un altro oggetto (in una modo unico). Seguendo l'esempio di diversi articoli che ho trovato on-line, decido di fix the problem genericamente, usando JSON.stringify
sulla serie completa di argomenti per la funzione di creare una chiave univoca per Memoizzazione:
function memoize(f){
var memo = {};
var slice = Array.prototype.slice;
return function(){
var args = slice.call(arguments);
var mkey = JSON.stringify(args);
if (!(mkey in memo)) memo[mkey] = f.apply(this,args);
return memo[mkey];
}
}
function rawBuild(o,indent){ .. }
var build = memoize(rawBuild);
Questo funziona, ma (a) E ' un po 'più lentamente di quanto mi piacerebbe, e (b) sembra selvaggiamente inefficiente (e poco elegante) per eseguire una serializzazione (ingenua) di ogni oggetto e valore che sto per serializzare in modo intelligente. L'atto di serializzare un oggetto grande con molti valori memorizzerà una stringa e un risultato di formattazione per OGNI valore univoco (non solo valori foglia) nell'intero oggetto.
Esiste un moderno trucco JavaScript che consenta di identificare univocamente un valore? Ad esempio, un modo per accedere a un ID interno o associare in altro modo oggetti complessi con numeri interi univoci che richiede O (1) tempo per trovare l'identificatore per un valore?
Molto simile alla (non proprio un DUP) di [JavaScript Object ID] (http://stackoverflow.com/q/2020670/405017). Non proprio un dup, perché ho bisogno di trovare una rappresentazione unica per la maggior parte del tipo di valore (stringa, booleana, numero, matrice, oggetto), non solo oggetti. – Phrogz
Vuoi memoize per valore dell'oggetto o riferimento? In altre parole: 'var a = {b: 1}; var c = memoizedFn (a); a.b = 2; var d = memoizedFn (a); 'la seconda chiamata dovrebbe utilizzare il valore memoized? –
@TamasHegedus Per riferimento è completamente sufficiente. – Phrogz