具有多个条件的JS三元函数?

42

我一直在JavaScript中使用三元运算符根据用户输入修改对象的值。我有以下代码,它可以正常运行:

var inputOneAns = inputOne == "Yes" ? "517" : "518";

如您所见,我正在为 inputOneAns 分配一个数字字符串值,无论用户是否输入了"Yes"或"No"。但是,可能会出现用户未选择值的情况(因为它不是必需的)。如果此输入留空,我希望将空字符串""分配给 inputOneAns 。是否有一种方法可以在另一个三元运算符中嵌入一个三元运算符?为了帮助澄清,这里是我想要使用三元函数实现的相同函数,但是使用if else语句进行实现。

if (inputOne == "Yes"){
    var inputOneAns = "517"
}else if (inputOne == "No"{
    var inputOneAns = "518"
}else{
    var inputOneAns = ""
}

能否在三元函数中包含多个表达式?有没有更好的方法来实现我所寻找的功能?提前感谢您的建议。


3
可以嵌套三元运算符,但通常不太清晰。 - MinusFour
7
不过还是算了吧。这段代码太丑陋了,使用 if/else 更易读。如果你的同事知道你住在哪里,这样写可能会有风险... - David Thomas
var choices = {Yes: 517, No: 518}; var inputOneAns = inputOne in choices ? choices[inputOne] : "" or inputOneAns = choices[inputOne] || "" - Bergi
9个回答

82

是的,你可以大胆地嵌套三元运算符。我认为这个版本相当易读:

var foo = (
  bar === 'a' ? 1 : // if 
  bar === 'b' ? 2 : // else if 
  bar === 'c' ? 3 : // else if
  null // else 
);

但那不是一种广为流传的观点,当你在团队中工作时,你应该坚持使用if / elseswitch


非常有用,我们可以使用这种语法编写多行语句吗? - Hidayt Rahman
1
是的,我不会过分使用它,但我喜欢它的原因是三元运算符是一个表达式而不是一个语句,所以你可以根据多个条件赋值一个const,而不需要重新分配一个变量。 - Damon
谢谢Damon,这真的很有帮助。 - Hidayt Rahman
1
这是一个漂亮而优雅的解决方案。谢谢。 - mrkkr91
1
你刚刚帮我避免了一个巨大的头痛…谢谢。 - Adetola Aremu

16

是的,你可以在三元运算符中使用多个条件。希望这会对你有所帮助。

var x=20;
var y = x<13 ? "Child" : x<20 ? "Teenage" : x<30 ? "Twenties" : "Old people";
console.log(y);

8

在这种情况下,使用switch语句可能是最好的选择。

let inputOneAns;
switch(inputOne) {
  case "Yes":
   inputOneAns = "517";
   break;
  case "No":
   inputOneNas = "518";
   break;
  default:
   inputOneNas = "";
}

如果您想要在2个以上的条件下执行三元操作,它们会变得非常混乱。您可以将条件组合在一起,但我不知道为什么您会想要这样做 - 那将非常混乱。


6
最优雅和简洁的方法是利用对象字面量:

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

这样做的优点在于既易读又灵活。

2

是的,你可以像使用else if语句一样将它们链接在一起,但有时阅读起来可能会有些困难,所以我倾向于将它们分成多行。

var inputOneAns = inputOne == 'Yes' ? '517' :
  inputOne == 'No' ? '518' : '';

然而在这种情况下,我建议使用switch语句,因为你需要比较每个case中相同的值。


2
var r = inputOne == "" ? "" : ( 
inputOne == "Yes" ? "517" : "518");

1

是的,它确实比switch语句提供了更干净的代码..所有的breaks..

inputOne == "Yes" ? "517" :
inputOne == "No" ? "518" : inputOneAns = "";

1

不幸的是,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] || '';

0

看起来这是一个 switch 语句的经典用法:

let inputOneAns = '';
switch(inputOne) {
  case 'Yes':
    inputOneAns = "517";
    break;
  case 'No': 
    inputOneAns = "518";
    break;
  default:
    inputOneAns = "";
}
  • 注意,实际上您并不需要默认情况,但我发现它可以使事情更易读。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接