を使用して事前に変数名を知っていれば、文字列を関数に簡単に変換できますFunction()
。最初のパラメーターは関数の引数で、最後のパラメーターは関数本体です。
var func1 = Function('avgFrags', 'return avgFrags * 250;');
これは次と同等です。
function func1(avgFrags) {
return avgFrags * 250;
}
既知の関数シグネチャ
ローカル ストレージ内の各アイテムに使用される変数名がわかっている場合は、関数で必要なことを簡単に行うことができます。
// from your edited question
form_frag = localStorage.getItem('formula_frag');
form_dmg = localStorage.getItem('formula_dmg');
// ... create functions
var fragsFunc = Function('avgFrags', form_frg );
var dmgFunc = Function('avgDmg', 'avgTier', form_dmg );
// ... get frags
var frags = fragsFunc (10); // frags = 2500; // if sample in storage
不明な関数シグネチャ
変数名の数が限られていて、各関数で使用される変数がわからない場合は、次のようにすることができます。
var avgFrags, avgDamage, avgTier, avgSpots, avgCap, avgDef;
// ... get from storage
form_frag = localStorage.getItem('formula_frag');
form_dmg = localStorage.getItem('formula_dmg');
// ... create functions
var fragsFunc = Function('avgFrags', 'avgDamage', 'avgTier', 'avgSpots', 'avgCap', 'avgDef', form_frag);
var dmgFunc = Function('avgFrags', 'avgDamage', 'avgTier', 'avgSpots', 'avgCap', 'avgDef', form_frag);
// ... get frags, only the first argument is used, but we don't know that.
var frags = fragsFunc (avgFrags, avgDamage, avgTier, avgSpots, avgCap, avgDef); // frags = 2500; // if sample in storage
関数に渡すことができるすべての引数を保持するオブジェクトである関数に変数を 1 つだけ渡すことで、これを簡単にすることができます。関数ライターがそのオブジェクトを使用することを確認する必要があります。
var settings = {
avgFrags: 10,
avgDamage: 50,
// ...
};
var fragsFunc = Function('s', 's.avgFrags * 250');
var frags = fragsFunc (settings);
正規表現でパーツを取得する
私は、変数名と数値と演算子を持つオブジェクトを実際には必要としないということで、上記で仕事が完了すると想定しています。
変数名と数値 (および演算子) だけが必要な場合は、そのために正規表現を使用できます。
([a-z_$][\w\d]*)|([0-9]*\.?[0-9]+)|([^\w\d\s])
これを使用して、各パーツで配列を作成できます。また、各部分はグループ化されているため、どれが変数名で、どれが数値で、どれがその他 (括弧または演算子) であるかがわかります。
var re = /(\w[\w\d]*)|([0-9]*\.?[0-9]+)|([^\w\d\s])/g,
match,
results;
while ((match = re.exec(localStorage.getItem('formula_frag'))) {
results.push({
text: match[0],
type: (match[1]) ? 'var' | (match[2]) ? 'number' : 'other'
})
}
REYを使用して、サンプル データで正規表現の出力を表示できます。