FAQ: Code Challenges: JavaScript Fundamentals - calculateWeight()

Well my thinking is that it’s something about the || not working how I’d expect with the !=

What I think I’m asking the function to do is check that the planet DOES NOT equal Mercury OR Venus OR Mars etc etc. (I put capitals to emphasise the logic)
If that test is true, then return the error message.
If that test is not true, then continue to the else if and return the string ‘Jupiter’.

I’m afraid I’m not sure what you mean about the ‘venus’ bit you wrote?

Thanks for the help :slight_smile:

if you try all the code samples i provided, what do we learn from that?

Or Venus doesn’t equal what? Or Mars doesn’t equal what?

Thanks - I did try them, but I didn’t see what you where getting at…
But I think I may now understand what you mean!!

If I just have the two, like you wrote:

if (planet != ‘Jupiter’ || ‘Venus’ )

Then if I test for Jupiter, that statement will be true, because Jupiter does not equal Venus! Hence it will display the error message.

Problem is that I can’t work out how to do a test that works how I’m intending, as if I use && then obviously it’s a totally different test, as (I think) it would test that the string matches all of them. Somehow I need to give a list of conditions to test against, where the test comes back true only if the string is not found amongst the list I’m testing for…

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