在javascript中创建数组而不是if…else
所以我对这个简单的边栏小工具有一个问题,我将在转换值时开发它(主要是在javascript中)。现在我的代码按原样工作,但重复使用了太多类似代码行(2000多行),这对于将来调试和更改某些代码来说是一件可怕的事情 所以我试着用数组来减少代码行,但是当我这样做的时候,我无法让它工作。这是我的作品样本在javascript中创建数组而不是if…else,javascript,arrays,Javascript,Arrays,所以我对这个简单的边栏小工具有一个问题,我将在转换值时开发它(主要是在javascript中)。现在我的代码按原样工作,但重复使用了太多类似代码行(2000多行),这对于将来调试和更改某些代码来说是一件可怕的事情 所以我试着用数组来减少代码行,但是当我这样做的时候,我无法让它工作。这是我的作品样本 function globVar() { var AIC = 4.11; //random value var BIC = 3.42; var CIC = 58.17;
function globVar()
{
var AIC = 4.11; //random value
var BIC = 3.42;
var CIC = 58.17;
var DID = 441.16;
}
function doCalc() {
globVar();
var cellX = document.getElementById("sel1").value;
var cellY = document.getElementById("sel2").value;
if (cellX == "REC" && cellY == "AIC") {
var x = document.getElementById("value1").value;
var y = x * AIC;
var y2 = y.toFixed(2);
document.getElementById("value2").value = y2;
}
if (cellX == "REC" && cellY == "BIC") {
var x = document.getElementById("value1").value;
var y = x * BIC);
var y2 = y.toFixed(2);
document.getElementById("value2").value = y2;
}
if (cellX == "REC" && cellY == "CIC") {
var x = document.getElementById("value1").value;
var y = x * (1 / CIC);
var y2 = y.toFixed(2);
document.getElementById("value2").value = y2;
}
}
这段代码可以工作,但要完成这项工作,超过50个变量的时间太长,不能与if-else一起使用,所以我尝试使用数组。。代码如下
globvar();
var cellX = document.getElementById("sel1").value;
var cellY = document.getElementById("sel2").value;
var unit1 = ["AIC", "BIC"];
var unit100 = ["CIC","DID"];
if (cellX == "REC") {
for (var i=0; i<2; i++) {
arrUnit = unit1[i];
if (cellY == arrUnit) {
var x = document.getElementById("value1").value;
var y = x * (1 / arrUnit);
var y2 = y.toFixed(2);
document.getElementById("value2").value = y2;
}
}
for (var j=0; j<2; j++) {
arrUnit = unit100[j];
if (cellY == arrUnit) {
var x = document.getElementById("value1").value;
var y = x * (1 / arrUnit);
var y2 = y.toFixed(2);
document.getElementById("value2").value = y2;
}
}
}
globvar();
var cellX=document.getElementById(“sel1”).value;
var cellY=document.getElementById(“sel2”).value;
变量单位1=[“AIC”,“BIC”];
var unit100=[“CIC”,“DID”];
如果(cellX==“REC”){
对于(var i=0;i免责声明:在纯javascript中计算带小数的数字是一个糟糕、非常糟糕的主意!
您可以使用或任何其他已正确使用小数的数学库
您正在寻找的东西-称为“”
您的代码可能如下所示:
var rates = { // here where your constants should be defined
'AIC': 0,
'BIC': 0,
'CIC': 0,
};
var actions = {
'REC': function (x, rate) {
return x * (1 / rate);
},
'XEC': function (x, rate) {
return x * rate;
}
};
function doCalc() {
globVar();
var cellX = document.getElementById("sel1").value;
var cellY = document.getElementById("sel2").value;
var x = document.getElementById("value1").value;
var y = actions[cellX](x, rates[cellY]);
document.getElementById("value2").value = y.toFixed(2);
}
function resetRates() {
globVar();
// To refresh rates with latest value
var excel = new ActiveXObject("Excel.Application");
excel.Visible = false; //false to hide while true to debug
var excel_file = excel.Workbooks.Open("//path/to/excelfiles/rates.xls");
var excel_sheet = excel_file.Worksheets("Sheet1");
rates['AIC'] = excel_sheet.Cells(3,7).Value;
rates['BIC'] = excel_sheet.Cells(4,7).Value;
rates['CIC'] = excel_sheet.Cells(5,7).Value;
rates['DID'] = excel_sheet.Cells(6,7).Value;
rates['EID'] = excel_sheet.Cells(7,7).Value;
rates['FID'] = excel_sheet.Cells(8,7).Value;
rates['GIE'] = excel_sheet.Cells(9,7).Value;
rates['HIE'] = excel_sheet.Cells(10,7).Value;
rates['IIE'] = excel_sheet.Cells(11,7).Value;
excel.Quit();
}
在这里,重置率应该是什么样子:
var rates = { // here where your constants should be defined
'AIC': 0,
'BIC': 0,
'CIC': 0,
};
var actions = {
'REC': function (x, rate) {
return x * (1 / rate);
},
'XEC': function (x, rate) {
return x * rate;
}
};
function doCalc() {
globVar();
var cellX = document.getElementById("sel1").value;
var cellY = document.getElementById("sel2").value;
var x = document.getElementById("value1").value;
var y = actions[cellX](x, rates[cellY]);
document.getElementById("value2").value = y.toFixed(2);
}
function resetRates() {
globVar();
// To refresh rates with latest value
var excel = new ActiveXObject("Excel.Application");
excel.Visible = false; //false to hide while true to debug
var excel_file = excel.Workbooks.Open("//path/to/excelfiles/rates.xls");
var excel_sheet = excel_file.Worksheets("Sheet1");
rates['AIC'] = excel_sheet.Cells(3,7).Value;
rates['BIC'] = excel_sheet.Cells(4,7).Value;
rates['CIC'] = excel_sheet.Cells(5,7).Value;
rates['DID'] = excel_sheet.Cells(6,7).Value;
rates['EID'] = excel_sheet.Cells(7,7).Value;
rates['FID'] = excel_sheet.Cells(8,7).Value;
rates['GIE'] = excel_sheet.Cells(9,7).Value;
rates['HIE'] = excel_sheet.Cells(10,7).Value;
rates['IIE'] = excel_sheet.Cells(11,7).Value;
excel.Quit();
}
如果您的函数对所有值都是相同的(y=x*
),您可以这样做
var v = [];
v['REC'] = [];
function globVar()
{
var rec = v['REC'];
rec['AIC'] = 4.11; //random value
rec['BIC'] = 3.42;
rec['CIC'] = 1 / 58.17;
rec['DID'] = 441.16;
}
globVar();
function doCalc() {
var cellX = document.getElementById("sel1").value;
var cellY = document.getElementById("sel2").value;
var x = document.getElementById("value1").value;
var y = x * v[cellX][cellY];
var y2 = y.toFixed(2);
document.getElementById("value2").value = y2;
}
否则,您也需要一个带有函数的数组。只是文章中的一个输入错误:var y=x*BIC);
?NaN
通常发生在您尝试混合使用字符串和数字进行计算时,请注意,输入元素的值是字符串。啊,我明白了。难怪我无法从globVar()获得值总之,总是会导致NaN。那么我应该怎么做才能使用数组从中获取值呢?我不知道,因为在您的代码中,您实际上正在执行例如:var y=x*(1/'AIC');
,我不知道,您在#value1
#value1中输入了什么(只是数字)由用户输入,脚本将自动计算并在#value2中显示结果。我不确定即使是if-else代码如何工作。您在函数中定义了AIC、BIC等,它们没有全局范围。哦,谢谢。不幸的是,这仍然是一个问题。在50个变量中只减少大约200行代码。我忘记了我的脚本只有两个公式,而且被反复使用,因此我想使用数组来简化它。@flagstar,你能提供完整的代码示例吗?因为它不清楚如何优化它。这是另一个示例。我仍然会缩短它,因为所有内容都是一样的,重复一行。@Teemu,请检查链接,provi由问题作者在下面的评论中编辑。pastebin.com/SvvXmnhr