具有多个条件的JS三元函数?
Posted
技术标签:
【中文标题】具有多个条件的JS三元函数?【英文标题】:JS Ternary functions with multiple conditions? 【发布时间】:2017-12-14 19:14:37 【问题描述】:我一直在 javascript 中使用三元运算符来根据用户输入修改对象的值。我有以下代码,它应该运行:
var inputOneAns = inputOne == "Yes" ? "517" : "518";
如您所见,我将数字字符串值分配给inputOneAns
无论用户输入的是“是”还是“否”。但是,可能存在用户没有选择值的情况(因为它不是必需的)。如果此输入留空,我想为inputOneAns
分配一个空字符串“”。有没有办法或我将一个三元运算符嵌入另一个三元运算符中?为了帮助澄清,这是我想用我的三元函数但使用 if else 语句来完成的相同函数?
if (inputOne == "Yes")
var inputOneAns = "517"
else if (inputOne == "No"
var inputOneAns = "518"
else
var inputOneAns = ""
是否可以在一个三元函数中包含多个表达式?有没有更好的方法来完成我正在寻找的东西?提前感谢您的提示。
【问题讨论】:
可以嵌套三元运算符,但通常不是很清楚let inputOneAns = inputOne === 'Yes' ? '517' : inputOne === 'No' ? '518' : '';
但不要这样做。这很丑陋,if
/else
更具可读性。如果你的同事知道你住在哪里,这是你不想冒的风险......
var choices = Yes: 517, No: 518; var inputOneAns = inputOne in choices ? choices[inputOne] : ""
或 inputOneAns = choices[inputOne] || ""
【参考方案1】:
是的,您可以在三元运算符中使用多个条件。希望这会对你有所帮助。
var x=20;
var y = x<13 ? "Child" : x<20 ? "Teenage" : x<30 ? "Twenties" : "Old people";
console.log(y);
【讨论】:
【参考方案2】:是的,它确实提供了比 switch 语句更简洁的代码.. 有所有的中断..
inputOne == "Yes" ? "517" :
inputOne == "No" ? "518" : inputOneAns = "";
【讨论】:
【参考方案3】:最优雅、最简洁的方法是利用 Object 字面量:
const Switch = (str) => (
"Yes": "517",
"No": "518",
)[str] || '';
console.log(Switch("Yes")); // 517
console.log(Switch("No")); // 518
console.log(Switch("Non matching value")); // Empty
这具有可读性和灵活性的优点。
【讨论】:
【参考方案4】:不幸的是,JavaScript 没有提供一种超级简洁易读的方式来执行此操作。就我个人而言,我只会使用一些像这样的单行 if
语句:
var inputOneAns;
if (inputOne === 'Yes') inputOneAns = '517';
if (inputOne === 'No') inputOneAns = '518';
else inputOneAns = '';
如果你把它抽象成一个函数会更简洁(注意:在这种情况下不需要else
):
function getInputOneAns(inputOne)
if (inputOne === 'Yes') return '517';
if (inputOne === 'No') return '518';
return '';
就我个人而言,我不太喜欢 switch 语句,原因有两个:首先,那些额外的 break
语句使代码膨胀,其次,switch 语句非常有限 - 你只能进行简单的相等检查,并且只能针对单个变量。此外,如果您知道您将始终检查单个字符串,我会更喜欢一个简单的地图对象:
var map = 'Yes': '517', 'No': '518' ;
var inputOneAns = map[inputOne] || '';
【讨论】:
【参考方案5】:var r = inputOne == "" ? "" : (
inputOne == "Yes" ? "517" : "518");
【讨论】:
【参考方案6】:是的,你可以去野外嵌套三元组。我觉得这个版本相当易读:
var foo = (
bar === 'a' ? 1 : // if
bar === 'b' ? 2 : // else if
bar === 'c' ? 3 : // else if
null // else
);
但这并不是一个广泛认同的观点,在团队中工作时您可能应该坚持使用if/else
或switch
。
【讨论】:
很有帮助,可以用这种语法写多行语句吗? 是的,我不会做得过火,但我喜欢它的原因是三元是表达式而不是语句,所以你可以根据多个条件分配const
,而不必重新分配变量。
谢谢达蒙,真的很有帮助【参考方案7】:
似乎是 switch 语句的经典用法:
let inputOneAns = '';
switch(inputOne)
case 'Yes':
inputOneAns = "517";
break;
case 'No':
inputOneAns = "518";
break;
default:
inputOneAns = "";
请注意,您实际上并不需要默认大小写,但我发现它使事情更具可读性。
【讨论】:
【参考方案8】:是的,您可以将它们链接在一起,就像使用 else if 语句一样,但有时它可能有点难以阅读,所以我倾向于将我的内容分成多行。
var inputOneAns = inputOne == 'Yes' ? '517' :
inputOne == 'No' ? '518' : '';
但是在这种情况下,我建议您使用 switch
语句,因为您正在比较每个案例的相同值。
【讨论】:
【参考方案9】:在这种情况下,switch 语句可能是最佳选择。
let inputOneAns;
switch(inputOne)
case "Yes":
inputOneAns = "517";
break;
case "No":
inputOneNas = "518";
break;
default:
inputOneNas = "";
如果你可以做超过 2 个条件的三元运算,它们会变得非常混乱。你可以把条件放在一起,但我不知道你为什么要这样 - 那会难以置信混乱。
【讨论】:
以上是关于具有多个条件的JS三元函数?的主要内容,如果未能解决你的问题,请参考以下文章