Why won't this ternary operator work?


#1

Here’s an if statement that works exactly as expected:

    if (sunsetMinute < 10) {
      sunsetMinute = '0' + sunsetMinute;
    }

I tried to write this as a ternary operator, but it tells me the semicolon is an unexpected token:

sunsetMinute < 10 ? sunsetMinute = '0' + sunsetMinute;

What am I doing wrong here?


#2

You are missing the colon section of the ternary for when the condition is false.


#3

also this is a false use of a ternary.

The ternary returns a value. So your ternary should be of the form
sunsetMinute = (sunsetMinute < 10) ? "0"+sunsetMinute : sunsetMinute;

or more simply, use the javascript function designed to handle this:
sunsetMinute = sunsetMinute.padStart(2,"0");

or use an actual datetime construct.


#4

Thanks. I thought that might be the case (although I also thought I wouldn’t need it if I I didn’t have a false condition) - I tried this before posting, which also didn’t work:

sunsetMinute < 10 ? sunsetMinute = '0' + sunsetMinute : ;

After you posted your response I tried this, which fixed it:

sunsetMinute < 10 ? sunsetMinute = '0' + sunsetMinute : sunsetMinute = sunsetMinute;

I’m a bit disappointed tbh, I thought the ternary would be less verbose than the if statement.


#5

There is an actual reason I’m not using that. Thanks for the padStart tip, I’ll keep that in mind in future.


#6

That’s only because a ternary is a short for “if else” and you are comparing it to only an “if”. eg. compare to

if (sunsetMinute < 10) { 
  sunsetMinute = 0 + sunsetMinute; 
} else { 
  sunsetMinute = sunsetMinute; 
} 

IMHO, you don’t need the “else” if you’re keeping the value the same, hence you don’t need the ternary.


#7

Is it possible to use a guard clause and a default clause instead?

sunsetMinute = (sunsetMinute < 10 && '0' + sunsetMinute) || sunsetMinute;

Yes it is possible, but it’s busier than it really needs to be.

When using the ternary, I think that I prefer it like this:

sunsetMinute = sunsetMinute >= 10 ? sunsetMinute : '0' + sunsetMinute;

Because that’s saying that the adjustment only occurs if it’s needed.

What about if we only focus on what is being added?

sunsetMinute = (sunsetMinute >= 10 ? "" : "0") + sunsetMinute;

That one is more preferable, as it’s clearly saying that we only prepend a 0 if it’s needed.


#8

Thanks for the help, everyone!