从switch语句返回一个值

问题描述 投票:-1回答:3

我是网络开发(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
javascript arrays function switch-statement return
3个回答
0
投票

让我们稍微分解一下这段代码并谈谈它正在做什么

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

打破整个程序,应该是一开始就与//发表评论。


0
投票

好吧,这不是一个好方法,但如果你需要使用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>

0
投票

这是一种冗长的方式来做我认为你想做的事情。 (总计提示)

// 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

在这里摆弄它

https://jsfiddle.net/Hastig/p1kfgreq/

© www.soinside.com 2019 - 2024. All rights reserved.