Возврат значения из оператора switch - PullRequest
0 голосов
/ 04 сентября 2018

Я новичок в веб-разработке (JS) и знаю, что есть много тем, соответствующих моему названию, но на подобные вопросы не было ответа, или, возможно, потому что я новичок, не смог найти.

В приведенном ниже коде я хотел, чтобы мои операторы функций и переключателей извлекали значения из массивов (счетов) и рассчитывали новое значение, которое должно быть назначено в новое несуществующее место в массиве 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

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Давайте немного разберем этот код и поговорим о том, что он делает

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 и будет выполнен, но он будет выполнять операцию с неопределенным значением. Если бы у вас не было второго параметра с именем tips, вы должны установить глобальный tips на 62.

    default:
      console.log('no tips left.');
  }

Эта часть должна выполняться в настоящее время, потому что она единственная, которая может быть верной, если два других случая структурированы неправильно.

  return tips;
}

Возвращает неопределенное значение, поскольку подсказки (в рамках самой функции) начинались как неопределенные и не были изменены.

  tips = tipCalc(bills[0]);
  console.log(tips);
  enter code here

Разбивает всю программу, должен быть комментарий с // в начале.

0 голосов
/ 04 сентября 2018

Вот подробный способ сделать то, что, я думаю, вы хотите сделать. (сложите общее количество советов)

// 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, потому что , как демонстрируется, медленнее с диапазонами

возиться с этим здесь

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

0 голосов
/ 04 сентября 2018

хорошо, это не очень хороший подход, но если вам необходимо использовать 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> 

Или, если вам нужно сравнить массив векселей и зависит от значения вставки в массив подсказок, я бы сделал его следующим образом:

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