具有多个条件的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/elseswitch

【讨论】:

很有帮助,可以用这种语法写多行语句吗? 是的,我不会做得过火,但我喜欢它的原因是三元是表达式而不是语句,所以你可以根据多个条件分配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三元函数?的主要内容,如果未能解决你的问题,请参考以下文章

函数,以及三元运算符

Python-函数式编程-map reduce filter lambda 三元表达式 闭包

试图弄清楚如何将具有多个条件的长三元运算符转换为长if语句

通过三元条件选择的指针调用函数

第三章三元运算文件处理函数

AngularJS:三元运算符条件检查中的函数调用