要約:オブジェクトをハッシュする高速な方法はJSON.stringify
ですか?オブジェクト引数の効率的なメモ帳
詳細:JavaScript値をきれいに印刷できるRubyおよびJavaScriptライブラリ(NeatJSON)があります。私は最近、深くネストされたオブジェクトが、直列化されるオブジェクトとインデント量に基づいてメモを使用して、O(n!)のパフォーマンス(ネストレベルであるn)を引き起こした問題を修正しました。ルビー、the fixで
は、本当に簡単だったことができますオブジェクトの一意のセットの配列によってインデックスハッシュ理由:内のJavaScriptでbuild = ->(object,indent) do
memoizer[[object,indent]] ||= <all the rest of the code>
end
、しかし、私は、インデックス別のオブジェクトによって、オブジェクトをすることはできません(ユニークな方法)。私はオンラインで見つけるいくつかの記事のリードに続いて、私はメモ化のためのユニークなキーを作成する関数に引数のフルセットにJSON.stringify
を使用して、一般的にfix the problemに決める:
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);
これは動作しますが、(a)はこれです(b)私がスマートにシリアル化しようとしているすべてのオブジェクトと値を(単純な)直列化を実行することは、非常に非効率的で(そして控えめで)思われます。多くの値を持つラージオブジェクトをシリアライズする行為は、文字列を格納し、オブジェクト全体にEVERY一意の値(葉の値だけではない)の結果を書式設定することになります。
値を一意に識別できる最新のJavaScriptトリックはありますか?たとえば、内部IDにアクセスする方法や、複雑なオブジェクトをO(1)時間を費やして値の識別子を見つけるユニークな整数に関連付ける方法はありますか?
(http://stackoverflow.com/q/2020670/405017)。オブジェクトだけでなく、ほとんどの種類の値(文字列、論理値、数値、配列、オブジェクト)のユニークな表現を見つける必要があるため、かなり大変です。 – Phrogz
オブジェクトの値または参照でメモしますか?言い換えれば、 'var a = {b:1}; var c = memoizedFn(a); a.b = 2; var d = memoizedFn(a); '2番目の呼び出しでmemoizedの値を使用する必要がありますか? –
@TamasHegedus参照は完全に十分です。 – Phrogz