FAQ: Code Challenges: JavaScript Fundamentals - calculateWeight()

you don’t do this comparison? In fact, you don’t do any comparison with 'Venus', so JS will simply see if 'Venus' is a truthy value, which is why included this code sample:

if ('Venus')

where for humans its obvious that:
check that the planet DOES NOT equal Mercury OR Venus OR Mars etc etc

we really mean: check that planet does not equal Mercury or that the planet does not equal Venus etc. For a computer, this isn’t the case.

Please can I ask then, just for my learning (not for this particular challenge where I could solve it with an ‘else’ at the end of the function), how would I do a test that behaved as I intended?
i.e. quickly check that a string does not match a list of options, without writing a long “if, else if” statement?

Another strange one for me. When running the tests on my code I’m getting the right results in the console (so an answer of 236 when using ‘Jupiter’ and an answer of ‘Invalid Planet Entry. Try: Mercury, Venus, Mars, Jupiter, or Saturn.’ when using any string other than the names of the prescribed planets.

As far as I can see I’m satisfying the criteria of the tests, I’m not getting any error messages but the test continues to fail for me.

Again would someone mind having a look at my code for anything obvious:

// Write your function here:
const calculateWeight = (earthWeight, planet) => {
  if (planet === 'Mercury') {
    return earthweight * 0.378;
  } else if (planet === 'Venus') {
    return earthweight * 0.907;
  } else if (planet === 'Mars') {
    return earthWeight * 0.377;
  } else if (planet === 'Jupiter') {
    return earthWeight * 2.36;
  } else if (planet === 'Saturn') {
    return earthWeight * 0.916;
  } else {
    return 'Invalid Planet Entry. Try: Mercury, Venus, Mars, Jupiter, or Saturn.';
  }
}

// Uncomment the line below when you're ready to try out your function
console.log(calculateWeight(100, 'Jupiter')) // Should print 236

// We encourage you to add more function calls of your own to test your code!

You have a couple of earthweights rather than earthWeights in there (i.e. capitalised W)

AHHHHHH! I did the same thing last night. I’ve got to stop trying to code when I should be asleep.
Thanks for your help.

we would need some kind of list (array), and then check if the element is in the array. We could do this manually using a loop, but given this is a common use case, someone already wrote a higher order function (includes) for it.

Great thanks - we haven’t covered arrays or loops, so I’ll hold out for future lessons!

Extra Study

The following makes use of an object with planet properties, and a logical expression to resolve the return value.

 > const calculateWeight = (earthWeight, planet) => {
     return {
       'Mercury': 0.378,
       'Venus': 0.907,
       'Mars': 0.377,
       'Jupiter': 2.36,
       'Saturn': 0.916
     }[planet] * earthWeight || 'Invalid Planet Entry. Try: Mercury, Venus, Mars, Jupiter, or Saturn.';
   }
<- undefined
 > calculateWeight(100, 'Jupiter')
<- 236
 > calculateWeight(100, 'Pluto')
<- "Invalid Planet Entry. Try: Mercury, Venus, Mars, Jupiter, or Saturn."

When the planet is not found in the property list, the result of the math is either 0 or NaN (we can find this out with a little experimenting) which results in the default operand being returned.

 > a = {
     'Mercury': 0.378,
     'Venus': 0.907,
     'Mars': 0.377,
     'Jupiter': 2.36,
     'Saturn': 0.916
   }
<- {Mercury: 0.378, Venus: 0.907, Mars: 0.377, Jupiter: 2.36, Saturn: 0.916}
 > a['Pluto'] * 100
<- NaN

NaN is falsy, hence,

 > NaN || 'Default'
<- Default

Objects are not too hard to get a handle on but logical expressions take some study and practice to be able to formulate. Time well spent.

2 Likes

They are trying to lead you to answer your question by thinking through it. When you add in the || or operator, you are essentially writing a new if statement. So what you wrote was essentially: if (planet !== ‘Mercury’) or if (‘Venus’") or if (‘Mars’) … etc.

Instead you need to create the !== phrase after each || or operator.

Like this:

if (planet !== ‘Mercury’ || planet !== ‘Venus’ || planet !== ‘Jupiter’ ||) etc.

1 Like

I have completed the calculate Weight problem and it returns the correct answer when appropriate and the “Inappropriate planet” message when appropriate, but I get the following error everytime. Can’t figure out what is going on. Here is the code and the error:

The string need to be an exact match, i suggest you copy the string from the instructions

That was it. Thanks so much! For some reason I assumed the code checker would be looking for a conditional statement instead of checking for the exact string. I think in some earlier projects it didn’t make a difference. I’ll stick to the brief going forward.

I initially tried this one by declaring a couple of variables, but it didn’t like that. I’m wondering why?

Here’s my code:

const calculateWeight = (earthWeight,planet) => {
  let earthWeight = 1; 
  let planet = 'Earth'; {
  switch (planet) {
    case 'Mercury':
      return (earthWeight * 0.378);
    case 'Venus':
      return (earthWeight * 0.907);
    case 'Mars':
      return (earthWeight * 0.377);
    case 'Jupiter':
      return (earthWeight * 2.36);
    case 'Saturn':
      return (earthWeight * 0.916);
    default:
      return 'Invalid Planet Entry. Try: Mercury, Venus, Mars, Jupiter, or Saturn.';
  }
 }
}

And the errors it returned:

SyntaxError: Identifier ‘earthWeight’ has already been declared
SyntaxError: Identifier ‘planet’ has already been declared

:confused: why?

It has been declared in the parameters. There are two positional arguments, of which the first could be 1.

calculateWeight(1, 'Mars')

So parameters declare? Huh. I’m so lost.

Parameters are locally declared variables, yes. We would not ignore them or redefine them, else they would be lost. Our function takes takes in data through the parameters.

1 Like

More studying to do. Thanks for your help.

1 Like

8 posts were split to a new topic: How earthWeight declared as a number?

I have a question around switch statements. In one of the previous challenges, my switch statement would just return undefined when I was trying to match on the argument but would pass when set to true. For example:

const lifePhase = age => {
  switch (age) {
    case (age < 0 || age > 140): return 'This is not a valid age';
    case (age < 4): return 'baby';
    case (age < 13): return 'child'; 
    case (age < 20): return 'teen';
    case (age < 65): return 'adult';
    case (age <= 140): return 'senior citizen';
  }
}

Output:

undefined
undefined

But in a later challenge, with the planets, it returns the expected value when matching on the argument, e.g.:

const calculateWeight = (earthWeight, planet) => {
  switch (planet) {
    case 'Mercury': return earthWeight * 0.378;
    case 'Venus': return earthWeight * 0.907;
    case 'Mars': return earthWeight * 0.377;
    case 'Jupiter': return earthWeight * 2.36;
    case 'Saturn': return earthWeight * 0.916;
    default: return 'Invalid Planet Entry. Try: Mercury, Venus, Mars, Jupiter, or Saturn.'
  }
}

Why is that?

because switch statement is designed for equality comparison with the cases.

from this example:

https://stackoverflow.com/questions/5464362/javascript-using-a-condition-in-switch-case

we could use the same trick:

switch (true)

now, you should be able to get results

when we see undefined, it means no return keyword was reached. Which tells us that none of your cases worked. You could have confirmed this by adding a default.