0

ユーザーが既に作成した静的変数を使用する数式を保存し、それらをローカルストレージに保存できるようにする機能を実現しようとしています。次に、スクリプトはその数式をローカル ストレージからフェッチし、計算を実行して、結果をテーブルに表示します。

取得部分を除いて、すべてが整っています。localStorage.getItem() は文字列を返し、それを parseFloat()/parseInt() で変換すると、最初の整数または NaN のみが返されます。これは両方とも、期待される結果を台無しにします。

整数と変数の両方を含む localStoage からオブジェクトを取得する方法はありますか?

これは、5 つの localStorage.getItem() リクエストによって取得される、機能する式の例です。

avgFrags*250
avgDmg*(10/(avgTier+2))*(0.23+2*avgTier/100)
avgSpots*150
log(avgCap+1,1.732)*150
avgDef*150

アイデアや代替案はありますか?

編集:

各行は getItem() リクエストの出力を表します。

form_frag = localStorage.getItem('formula_frag');
form_dmg = localStorage.getItem('formula_dmg');
form_spot = localStorage.getItem('formula_spot');
form_cap = localStorage.getItem('formula_cap');
form_def = localStorage.getItem('formula_def');
4

3 に答える 3

3

すべての値が文字列にプッシュされるキー値ストア内の localStorage ストア。「整数」を処理していることが確実な場合は、文字列を数値にプッシュできます。

var avgFrags = +localStorage.getItem('avgFrags'); // The + infront pushes the string to number.

あなたの質問を理解しているかどうか完全にはわかりません。

(+"123") === 123
于 2013-07-20T03:06:45.200 に答える
1

を使用して事前に変数名を知っていれば、文字列を関数に簡単に変換できます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を使用して、サンプル データで正規表現の出力を表示できます。

于 2013-07-20T03:21:49.920 に答える
0

はい、ローカルストレージにオブジェクトを設定できます

これがそのフィドルです - http://jsfiddle.net/sahilbatla/2z0dq6o3/

Storage.prototype.setObject = function(key, value) {
    this.setItem(key, JSON.stringify(value));
}

Storage.prototype.getObject = function(key) {
    var value = this.getItem(key);
    return value && JSON.parse(value);
}

$(function() {
    localStorage.setObject('x', {1: 2, 2: "s"})
    console.log(localStorage.getObject('x'));
});
于 2014-12-19T15:52:55.993 に答える