Reputation: 1487
I need to find the most succinct way to return one of three values based on two arguments. I think a switch statement is the most succinct but please suggest alternatives.
I have two arguments, type
and action
If action == 'close'
then the returned result should always be 'Hide'
If action == open
then more checks are needed
If action == 'open' && type == 'flight'
return show more flights
If action == 'open' && type == 'protection'
return show protections
What's the most succinct way to do this without involving multiple nested if
statements? This whole statement is already inside another if
statement called by a ternary so I don't really want to add more.
This is my current solution, any way I can make this lighter?
createShowLabels: function(testEnabled,action,type){
if (testEnabled){
if(action === 'open'){
switch(type) {
case 'flight':
return 'Show flight times';
case 'protection':
return 'What\'s this?';
}
} else {
return 'Hide';
}
} else {
// Defaults
if (action === 'open'){
return 'Show more';
} else {
return 'Show less';
}
}
},
Upvotes: 2
Views: 32
Reputation: 1075417
First, let's be clear: "Succinct" is not a synonym for "good," "readable," or "maintainable." Sometimes succinct code is good, readable, and maintainable; sometimes, it isn't.
Given your guarantee in the comments that the values will only be the ones listed, there are several ways.
In my own code, I would probably use somnething like FDavidov's answer but with different formatting:
if (action == 'close') {
result = 'Hide';
} else if (type == 'flight') {
result = 'show more flights';
} else {
result = 'show protections';
}
But you asked for the most succinct way. The conditional operator is succinct, but not necessarily hyper-easy to debug:
result = action == 'close' ? 'Hide' : type == 'flight' ? 'show more flights' : 'show protections';
Example:
function test(action, type) {
return action == 'close' ? 'Hide' : type == 'flight' ? 'show more flights' : 'show protections';
}
console.log(test('close', 'flight'));
console.log(test('close', 'protections'));
console.log(test('open', 'flight'));
console.log(test('open', 'protections'));
These are all less concise but more configurable:
You can use a lookup object:
var lookup = {
'close|flight': 'Hide',
'close|protections': 'Hide',
'open|flight': 'show more flights',
'open|protections': 'show protections'
};
result = lookup[action + '|' + type];
Example:
var lookup = {
'close|flight': 'Hide',
'close|protections': 'Hide',
'open|flight': 'show more flights',
'open|protections': 'show protections'
};
function test(action, type) {
return lookup[action + '|' + type];
}
console.log(test('close', 'flight'));
console.log(test('close', 'protections'));
console.log(test('open', 'flight'));
console.log(test('open', 'protections'));
Or as you say, a switch:
switch (action + '|' + type) {
case 'close|flight': result = 'Hide'; break;
case 'close|protections': result = 'Hide'; break;
case 'open|flight': result = 'show more flights'; break;
case 'open|protections': result = 'show protections'; break;
};
Example:
function test(action, type) {
var result;
switch (action + '|' + type) {
case 'close|flight': result = 'Hide'; break;
case 'close|protections': result = 'Hide'; break;
case 'open|flight': result = 'show more flights'; break;
case 'open|protections': result = 'show protections'; break;
};
return result;
}
console.log(test('close', 'flight'));
console.log(test('close', 'protections'));
console.log(test('open', 'flight'));
console.log(test('open', 'protections'));
Upvotes: 3
Reputation: 3667
If you are looking for short-handed phrasing, this is not what you are looking for. This is a very simple and READABLE way to write what you want:
if (action == 'close') {
return 'Hide';
}
else if (action = 'open') {
if (type = 'flight' ) {return 'show more flights'}
else if (type = 'protection') {return 'show protections' }
}
Upvotes: 2