我是网络开发(JS)的新手,我知道有许多主题与我的标题相匹配,但没有回答类似的问题,或者可能是因为我是新手,找不到。
在下面的代码中,我想要我的函数和switch语句,从数组(账单)中检索值,以及计算新值,该值将被分配到数组tips
中的新的不存在的位置。作为最终结果,我希望函数返回带有值的tips
数组,具体取决于具体情况。
我知道解决这个问题的另一种方法,无论如何我想知道这里有什么不对,因为solving
的想法首先出现在我脑海中,我认为它会起作用。
这是我的代码:
var tips = [];
var bills = [124, 48, 264];
function tipCalc(bills, tips){
switch(bills){
case bills < 50:
tips[0] = bills[1] * 0.2;
break;
case bills > 50:
tips[1] = bills[0] * 0.5;
break;
default:
console.log('no tips left.');
}
return tips;
}
tips = tipCalc(bills[0]);
console.log(tips);
enter code here
让我们稍微分解一下这段代码并谈谈它正在做什么
var tips = [];
var bills = [124, 48, 264];
这部分是在全局范围内声明两个变量,任何读取和写入函数都可以访问这两个变量(重要的 - Google JS闭包)。
function tipCalc(bills, tips){
switch(bills){
您现在已经启动了一个调用开关来评估账单价值的功能。因为你正在传递bills[0]
,它将评估账单[0](124)。它还接受一个名为tips的第二个参数,它是未定义的,因为在调用函数时不会传入第二个参数。
case bills < 50:
tips[0] = bills[1] * 0.2;
break;
这部分坏了。如果它被更改为if
语句,它将评估为false。
case bills > 50:
tips[1] = bills[0] * 0.5;
break;
也破了。如果更改为if
语句,它将评估为true并执行,但它将在undefined上执行操作。如果你没有第二个参数也命名为tips
,那么你将把全局tips
设置为62。
default:
console.log('no tips left.');
}
这是当前应该执行的部分,因为它是唯一一个可以为true而其他两个结构不正确的情况。
return tips;
}
将返回undefined,因为提示(在函数本身的范围内)开始为未定义且未被更改。
tips = tipCalc(bills[0]);
console.log(tips);
enter code here
打破整个程序,应该是一开始就与//
发表评论。
好吧,这不是一个好方法,但如果你需要使用Switch,你可以尝试这样没有账单数组:
<script type="text/javascript">
var tips = [];
function tipCalc(bill) {
switch (true) {
case (bill < 50):
tips.push(bill * 0.2);
break;
case (bill > 50):
tips.push(bill * 0.5);
break;
default:
console.log('no tips left.');
}
return tips;
}
tipCalc(10);
for (let index = 0; index < tips.length; index++) {
console.log(tips[index]);
}
</script>
或者如果您需要比较bill数组并依赖于插入到数组的值,我将使它像:
<script type="text/javascript">
var tips = [];
var bills = [124, 48, 264];
function tipCalc(bills) {
for (let index = 0; index < bills.length; index++) {
if (bills[index] <=50) {
tips.push(bills[index] * 0.2);
}
else if (bills[index] >= 50) {
tips.push(bills[index] * 0.5);
}
else
console.log("no tips left.");
}
}
tipCalc(bills);
for (let index = 0; index < tips.length; index++) {
console.log(tips[index]);
}
</script>
这是一种冗长的方式来做我认为你想做的事情。 (总计提示)
// create a blank tips array which we'll add to later
var tips = [];
// our bills array
var bills = [124, 48, 264];
// create a function that will calculate tips based on the bill totals
function calculateTips() {
// create a counter that we will use to determine when we've reached the end of the loop
var forEachCounter = 0;
// for each will loop through each item in the bills array
bills.forEach(function(amount) {
//this increases the counter by 1 on each loop
forEachCounter++;
switch(true) {
case (amount <= 50):
// .push appends to the array
tips.push(amount * 0.2);
break;
case (amount > 50):
// amount is the value of the bill for this iteration * 0.5
tips.push(amount * 0.5);
break;
}
// if end of array has been reached
// bills.length = the total amount of array items in bills arrat
if (forEachCounter === bills.length) {
// create a totalTips variable to add to
var totalTips = 0;
// create another counter to detect when end is reached
var forEachCounter2 = 0;
// loop through the tips array
tips.forEach(function(tipamount) {
// add 1 to counter on each loop
forEachCounter2++;
// add to totalTips
// can also do totalTips = totalTips + tipamount;
totalTips += tipamount;
// when end of tip array is reached..
if (forEachCounter2 === tips.length) {
//alert(totalTips);
// output it to where you need it
document.getElementsByTagName('body')[0].innerHTML = totalTips;
}
})
}
})
}
// call it when you need it
calculateTips();
注意
如果您正在处理许多提示(如整个国家连锁餐厅),您可能需要考虑使用if / else而不是switch,因为switch is demonstrated to be slower with ranges
在这里摆弄它