Use switch to test if a value is between a range of values

Asked

Viewed 1,947 times

0

I’m not able to compare the values within a switch case:

function determinarGeracao(anoDeNascimento) {

/*
Complete a função onde voce deve comparar o
* valor da variavel anoDeNascimento e atribuir na variavel 
*resultado uma das seuintes condições.
 * Geração silenciosa: para os nascidos até o ano de 1945;
 * Boomers: para os que nasceram depois de 1945 até 1964;
 * Geração X: para os que nasceram depois de 1964 até 1980;
 * Millennials: para os que nasceram depois de 1981 até 1996;
 * Geração Z: para os que nasceram depois de 1996;
 *
 */


  let resultado;
  anoDeNascimento = 1980;

  switch(anoDeNascimento ){

      case anoDeNascimento == 1945:
      resultado = console.log('Geração silenciosa');
      break;

      case anoDeNascimento > 1945 && anoDeNascimento <=1964:
      resultado = console.log('Boomers');
      break;

      case anoDeNascimento > 1964 && anoDeNascimento <=1980:
      resultado = console.log('Geração X');
      break;

      case anoDeNascimento > 1980 && anoDeNascimento <=1996:
      resultado = console.log('Millennials');
      break;

      case anoDeNascimento > 1996 :
      resultado = console.log('Geração Z');
      break;
      default:
     resultado =  console.log('opção errada');
  }
  return resultado;
  • 2

    Use if/else instead of switch, plain as that :-)

  • 1

    Of curiosity, what would be the reason I chose precisely the switch for this scenario?

  • 1

    Place a parenthesis in the test conditions: ( ) that will work. Example: ( anoDeNascimento == 1945 )

  • 1

    @Ivanferrer Are you sure? https://jsfiddle.net/jk5a8zg7/2/

  • So, try like this, should work.

  • In fact, the switch case is being used in the wrong way, nor would be necessary, because it is a case comparator... it really won’t work this way, I thought because it works in php would also work in javascript. What actually happens is that the switch is already playing the role of if... ideone

  • 1

    @Ivanferrer Actually in PHP "works" by coincidence, because the switch uses the Loose comparison, according to which any number greater than zero is equal to TRUE, so "it works". But it won’t always work: https://ideone.com/Zuq8iD

Show 2 more comments

6 answers

7

When you do:

switch(valor) {
    case outroValor:
        ....

The idea is that valor be compared with outroValor. But case outroValor is an expression, the outworking of this expression which is compared with valor. Ex:

let x = 1;
switch(x) {
    case x > 0:
        console.log('positivo');
        break;
    case x < 0:
        console.log('negativo');
        break;
    default:
        console.log('nenhum');
}

switch(x) will compare the value of x (which is the number 1) with the result of expressions x > 0 and x < 0. But both are comparisons, the result of which is a boolean (true or false).

According to the documentation (and the language specification), switch uses the operator === to compare the values. Like the number 1 is not a boolean, he is not equal to true, nor the false (so much 1 === true how much 1 === false are false), and therefore it falls into the case default, and the above code prints "no".


That means that the switch whose conditions are the results of a comparison would only work if the variable being tested is boolean:

let x = 1;
let y = false;
switch (y) {
    case x > 0:
        console.log('positivo');
        break;
    case x < 0:
        console.log('negativo');
        break;
    default:
        console.log('nenhum');
}

The above code prints "negative". That’s because switch(y) will first compare the value of y (which is the value boolean false) with the result of the expression x > 0 (that is true). Afterward y is compared with the result of x < 0 (that is false), and how y is also false, the code prints "negative".


Anyway, to do what you need, use if and else:

function determinarGeracao(anoDeNascimento){
    if (anoDeNascimento == 1945) {
        return 'Geração silenciosa';
    } else if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) {
        return 'Boomers';
    } else if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) {
        return 'Geração X';
    } else if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) {
        return 'Millennials';
    } else if (anoDeNascimento > 1996) {
        return 'Geração Z';
    } else return 'opção errada';
}

console.log(determinarGeracao(1980));

First of all, notice I didn’t put console.log within the function. console.log returns undefined, then it makes no sense to assign your return to a variable. Either you print, or you return this value to be printed elsewhere. So the function simply returns the text corresponding to the generation.

Another detail is that in this logic, if the person was born before 1945, is considered invalid ("wrong option"). But in the statement is thus:

Silent generation: for those born until 1945;

So actually the code should be like this:

function determinarGeracao(anoDeNascimento){
    if (anoDeNascimento <= 1945) {
        return 'Geração silenciosa';
    }
    if (anoDeNascimento <= 1964) {
        return 'Boomers';
    }
    if (anoDeNascimento <= 1980) {
        return 'Geração X';
    }
    if (anoDeNascimento <= 1996) {
        return 'Millennials';
    }
    return 'Geração Z';
}

console.log(determinarGeracao(1980));

First I test whether the year is less than or equal to 1945 ("Silent Generation"). Note that you do not need the else, for the return already returns the value and exits the function, so if you enter any if, the function will already return some value and will not execute the other if's.

Then the next if I just check if the year is less than 1964. The if already assures me that at this point of the function the year is greater than 1945 (if it were not, would have entered the if previous and returned), so I don’t need to put this back on if.

The same goes for the other values, and in the last case, the "Generation Z", nor need if, because if it got there, it is because the year is not in any of the previous cases (obviously that I’m not checking if the anoDeNascimento is in fact a number, but you could include such verification also).


Another detail is that you were doing this:

function determinarGeracao(anoDeNascimento) {
    anoDeNascimento = 1980;
    ...
}

That is, you receive a value as a function parameter, and then overwrite this value. I removed this line and within the function use the value that was passed the same.


In the statement it still says:

assign in the result variable one of the following conditions: ...

And maybe that’s why you’re doing resultado = 'alguma coisa'. Well, I think this might be confusing you, because it might imply that this should be done within the function, as you’re trying to do:

function determinarGeracao(anoDeNascimento){
    let resultado;
    if (anoDeNascimento <= 1945) {
        resultado = 'Geração silenciosa';
    }
    if (anoDeNascimento <= 1964) {
        resultado = 'Boomers';
    }
    ... etc....

    return resultado;
}

But what I understand is that’s all you really need:

function determinarGeracao(anoDeNascimento){
    if (anoDeNascimento <= 1945) {
        return 'Geração silenciosa';
    }
    if (anoDeNascimento <= 1964) {
        return 'Boomers';
    }
    if (anoDeNascimento <= 1980) {
        return 'Geração X';
    }
    if (anoDeNascimento <= 1996) {
        return 'Millennials';
    }
    return 'Geração Z';
}

let resultado = determinarGeracao(1980);

The variable resultado receives the return of the function, and then you can do whatever you want with it (print with console.log, for example).


Note: going a little further, numbers and other types can be "converted" to Boolean, through a mechanism known as type coercion.

2

When checking whether a value or variable is contained within a range, or multiple tracks, it is best to use the conditional operator if.

console.log(determinarGeracao(prompt("Entre com o ano de nascimento", 1980)));


    function determinarGeracao(anoDeNascimento) {

      if (anoDeNascimento <= 1945) return 'Geração silenciosa';
      if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) return 'Boomers';
      if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) return 'Geração X';
      if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) return 'Millennials';
      if (anoDeNascimento > 1996) return 'Geração Z';
      return 'Entrada inválida'
    }

Editing: How you reported your exercise requires an intermediate variable to be used, resultado. Disadvantage of this approach is that each function call is spent time allocating memory to the variable and after the result is found without the possibility of unnecessary comparisons being made.

console.log(determinarGeracao(prompt("Entre com o ano de nascimento", 1980)));


function determinarGeracao(anoDeNascimento) {

  let resultado = 'Entrada inválida';

  if (anoDeNascimento <= 1945) resultado = 'Geração silenciosa';
  if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) resultado = 'Boomers';
  if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) resultado = 'Geração X';
  if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) resultado = 'Millennials';
  if (anoDeNascimento > 1996) resultado = 'Geração Z';

  return resultado;
}

1

/* It worked well, just swap the console log for Return, that’s fine, but so you test. Copy it exactly like this and test it on your console. The difference there is that it will look for the expression vtrue, just when you say, "anodenasc system.. is > or = the 1980!" ebtent that you do not ask, you claim, the question is in If, then it will say, "truth!" then it will return you the value you determined (in case the string 'Generation x')*/

Let anoDeNascimento = 1960; Let test = true

switch(test ){

case anoDeNascimento == 1945:
console.log('Geração silenciosa');
break;

case anoDeNascimento > 1945 && anoDeNascimento <=1964:
console.log('Boomers');
break;

case anoDeNascimento > 1964 && anoDeNascimento <=1980:
console.log('Geração X');
break;

case anoDeNascimento > 1980 && anoDeNascimento <=1996:
console.log('Millennials');
break;

case anoDeNascimento > 1996 :
console.log('Geração Z');
break;
default:

console.log('wrong option'); }

0

function determinarGeracao(anoDeNascimento){
    if (anoDeNascimento < 1945) {
        return 'opção errada';
    }
    if (anoDeNascimento == 1945) {
        return 'Geração silenciosa';
    }
    if (anoDeNascimento <= 1964) {
        return 'Boomers';
    }
    if (anoDeNascimento <= 1980) {
        return 'Geração X';
    }
    if (anoDeNascimento <= 1996) {
        return 'Millennials';
    }
    return 'Geração Z';
}

console.log(determinarGeracao(1980));

console.log(determinarGeracao(prompt("Entre com o ano de nascimento", 1980)));


    function determinarGeracao(anoDeNascimento) {

      if (anoDeNascimento <= 1945) return 'Geração silenciosa';
      if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) return 'Boomers';
      if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) return 'Geração X';
      if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) return 'Millennials';
      if (anoDeNascimento > 1996) return 'Geração Z';
      return 'Entrada inválida'
    }

console.log(determinarGeracao(prompt("Entre com o ano de nascimento", 1980)));


    function determinarGeracao(anoDeNascimento) {

      if (anoDeNascimento <= 1945) return 'Geração silenciosa';
      if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) return 'Boomers';
      if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) return 'Geração X';
      if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) return 'Millennials';
      if (anoDeNascimento > 1996) return 'Geração Z';
      return 'Entrada inválida'
    }
Thank you very much for your answers, but I’d like to ask you something else if I don’t mind. in the statement it says to compare and assign the response in the variable result one of the following conditions, Anyway I was trying with switch case because in the statement I was saying that it was a switch case problem I didn’t imagine that I wouldn’t be able to make two comparisons within a case. Apologies for my ignorant questions I’m new to the subject of programming, I’m trying various ways to get the result but unfortunately I’m not getting.

Function determinarGeracao(anoDeNascimento){ Let result;

if (anoDeNascimento == 1945) {
    return resultado = 'Geração silenciosa';

} else if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) {
   return resultado = 'Boomers';

} else if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) {
    return resultado = 'Geração X';

} else if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) {
    return resultado = 'Millennials';

} else if (anoDeNascimento > 1996) {
     return resultado = 'Geração Z';

}
console.log(determinarGeracao(1980));
console.log(resultado);

}inserir a descrição da imagem aqui

  • If you want to store the result in a variable, do resultado = determinarGeracao(1990) (and then you can do whatever you want with the variable resultado). The important thing is to do this outside the function, as was done in the examples of the other answers

  • Another thing, the idea of the site is to have a question by specific problem, and not to argue indefinitely as in a forum. So if one of the answers solved the specific question problem, you can choose the one that best solved it and accept it, see here how and why to do it. It is not mandatory, but it is a good practice of the site, to indicate to future visitors that it solved the problem. If you have a different question (even if it is related), ask another question

  • Poxa life, worse than I could not solve the problem :/ but all right, obg by the help!

  • @Lucianomelo, I’m going to have to be the bad guy. This section is exclusive for answers that are attempts to solve the problem proposed in the question. Then I will ask you to delete that "answer". As for the problem still persist, I will make a modification in my answer to see if it clears your doubt.

  • 1

    Luciano, I also updated my answer, trying to clarify some points (based on what I understood to be your difficulty). Anyway, as already explained, this space is only for answers. If you have a different question than the one in the question, it would be the case to ask another question...

0


Try it like this, it’ll work:

  function determinarGeracao(anoDeNascimento) {

/*
Complete a função onde voce deve comparar o
* valor da variavel anoDeNascimento e atribuir na variavel 
*resultado uma das seguintes condições.
 * Geração silenciosa: para os nascidos até o ano de 1945;
 * Boomers: para os que nasceram depois de 1945 até 1964;
 * Geração X: para os que nasceram depois de 1964 até 1980;
 * Millennials: para os que nasceram depois de 1981 até 1996;
 * Geração Z: para os que nasceram depois de 1996;
 *
 */


  let resultado;
 // anoDeNascimento = 1980;


     if (anoDeNascimento > 1945 && anoDeNascimento <=1964) {
         anoDeNascimento = 'boomers';
     }
     if (anoDeNascimento > 1964 && anoDeNascimento <=1980) {
         anoDeNascimento = 'geracaox';
     }
     if (anoDeNascimento > 1980 && anoDeNascimento <=1996) {
         anoDeNascimento = 'millennials';
     }
     if (anoDeNascimento > 1996) {
         anoDeNascimento = 'geracaox';
     }


  switch(anoDeNascimento ){


      case 1945:
      resultado = 'Geração silenciosa';
      break;

      case 'boomers':
      resultado = 'Boomers';
      break;

      case 'geracaox':
      resultado = 'Geração X';
      break;

      case 'millennials':
      resultado = 'Millennials';
      break;

      case 'geracaox' :
      resultado = 'Geração Z';
      break;
      default:
      resultado = 'opção errada';
  }
  console.log(resultado);
  return resultado;
}

  alert(determinarGeracao(1996));

You can also do so (just an idea):

function determinarGeracao(ano) {

     this.mapArr = function(intervalYearsOld, year) {
          return Array(intervalYearsOld).fill(year).map((x, y) => x + y);   
     }

     var boomers =  this.mapArr(21, 1944), 
         geracao_x = this.mapArr(18, 1964), 
         millenials = this.mapArr(15,1982),
         geracao_z = this.mapArr((new Date()).getFullYear(),1996);
     var periods = [
       {"years":[1945],     "title": "Geração sileciosa"},
       {"years":boomers,    "title": "Boomers"},
       {"years":geracao_x,  "title": "Geração X"},
       {"years":millenials, "title": "Millennials"},
       {"years":geracao_z, "title": "Geração Z"}          
    ];
      for(var i in periods){
          //console.log(periods[i].years);
         if (periods[i].years.indexOf(ano) !== -1) {
             return periods[i].title;
         }
      }
     return 'Opção errada';

}

-2

Function determinarGeneration(year) {

if (anoDeNascimento <=1945) {
    return resultado = 'Geração silenciosa';
} else if (anoDeNascimento > 1945 && anoDeNascimento <= 1964) {
    return resultado = 'Boomers';
} else if (anoDeNascimento > 1964 && anoDeNascimento <= 1980) {
    return resultado = 'Geração X';
} else if (anoDeNascimento > 1980 && anoDeNascimento <= 1996) {
    return resultado = 'Millennials';
} else if (anoDeNascimento > 1996) {
    return resultado = 'Geração Z';
} 

console.log(determinarGeracao(1986)); console.log(result);

}

I did it and it worked.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.