Fred Hors
Fred Hors

Reputation: 4116

Javascript, string concatenation without ternary operator

Usually I use this:

myVar = "myString is" + 1 === 1 ? " really true" : " false, I think";

Maybe I need just the true part, let's say:

myVar = "myString is" + 1 === 1 ? " really true" : "";

I don't like this part: : "" because is useless.

Is there a way to use something like the below?

myVar = "myString is" + 1 === 1 && " really true";

It works but there is a problem when is false because it writes "false"!

Upvotes: 3

Views: 971

Answers (6)

leo-diehl
leo-diehl

Reputation: 11

Analysing the ternary operator we conclude that it's something like this:

// Example: 1 === 1 ? ' is really true' : ''
if (1 === 1) {
    return ' is really true';
} else {
    return '';
}

So the solution would be simply to remove the 'else' from the ternary operator, generating a 'binary'. Use a lone IF:

if (1 === 1) {
    myVar += 'is really true';
}

The best solution to use the logic operator inline is the ternary operator itself. It's not a problem to have the 'false' part of it as a empty string "". But if you're really annoyed by it you could create a function and use the template literals like this:

function myFunction(evaluation) {
    if (evaluation) {
        return ' really true';
    }
    return '';
}

let myVar = `My String is ${myFunction(1 === 1)}`;

Upvotes: 0

keja
keja

Reputation: 1363

another way to achieve something like this could be to use an Array, and concat the values if they are not false. Not that it is any shorter than adding the : '', but as far as i know there is no way to get rid of the : ''

console.log( ["my string is", 1 === 1 && "really true"].filter(Boolean).join(" ") );
console.log( ["my string is", 1 === 2 && "really true"].filter(Boolean).join(" ") );

i would prob stick with the : '' or write a helper function that could look something like this.

function concat(){
  let str = "";
  for(let s of arguments){
    str += s ? s : '';
  }
  return str;
}

console.log( concat("my string is", 1 === 1 && "really true") );
console.log( concat("my string is", 1 === 2 && "really true") );

Upvotes: 0

ionizer
ionizer

Reputation: 1721

Wrap the 1 === 1 && " really true" inside parentheses () and add || '' like below (also wrapped in parentheses), or could use template literals to save you some time from typing those +s

let myString = "myString is" + ((1 === 1 && " really true") || '');
let myFalseString = "myString is" + ((1 === 0 && " really true") || '');
let onlyFalse = "myString is" + 1 === 1 && " really true";
let myTL = `myString is ${(1 === 1 && "really true") || ''}`;

console.log('My String:', myString);
console.log('False String:', myFalseString);
console.log('Only false:', onlyFalse);
console.log('My Template Literal:', myTL);

Looks much worse than having the extra : "" though so I would still recommend doing it like that:

myVar = "myString is" + 1 === 1 ? " really true" : "";

Upvotes: 0

Sushanth --
Sushanth --

Reputation: 55740

You can just use ||

myVar = (1 === 1 && "myString is really true") || "";

Upvotes: 0

sbrass
sbrass

Reputation: 995

You could always go with a good old if statement

var myVar = 'myString is';
if (1===1){myVar+=' really true';}

I think that makes it more readable than a one line boolean test

Upvotes: 1

Mosè Raguzzini
Mosè Raguzzini

Reputation: 15821

To be pragmatic the best pattern and best way to write this is to rely on a helper:

myVar = "my string is"+myHelper(...myParams);

Then in the helper we'll have a case/switch that is made exactly with this purpose and is really readable.

Upvotes: 0

Related Questions