我正在尝试实现一个功能,使用户能够保存使用我已创建的静态变量的数学公式,并使用Local Storage保存它们。 然后脚本从本地存储中获取该公式,进行数学运算并在表格上显示结果。
除了提取部分外,我有一切顺序; as 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');
答案 0 :(得分:3)
localStorage存储在键值存储中,其中每个值都被推送到字符串。如果您确定要处理“整数”,则可以将字符串推送到数字:
var avgFrags = +localStorage.getItem('avgFrags'); // The + infront pushes the string to number.
我不完全确定我理解你的问题。
(+"123") === 123
答案 1 :(得分: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 查看包含示例数据的正则表达式的输出。
答案 2 :(得分: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'));
});