2013-07-20 79 views
0

我試圖實現一個功能,使用戶能夠保存使用已創建的靜態變量的數學公式,並使用本地存儲將其保存。 然後該腳本從本地存儲中獲取該公式,進行數學運算並在桌面上顯示結果。保存整數和變量的HTML5本地存儲

我有一切順序,除了拿取部分;作爲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'); 

回答

3

localStorage存儲在鍵值存儲中,其中每個值都被推送到一個字符串。如果你是certent你正在處理「整數」你可以將字符串推到一個數字:

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

我不能完全肯定,我明白你的問題。

(+"123") === 123 
+0

編輯的問題 – Orrie

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 

你可以通過只將一個變量傳遞給函數來簡化它,該函數是一個包含所有可以傳遞給函數的參數的對象。只需確保函數編寫器使用該對象。

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

+0

感謝您的想法,我會看看我是否可以利用這一點。 – Orrie

0

在localStorage的

這裏是你可以設置對象是爲小提琴 - 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')); 
});