避免嵌套三元

Avoid nested ternary

我写的代码是这样的:

query = (type) ? (parent) ? { parent: parent } : { type: type } : {}

我不知道应该避免嵌套三元。但是正确编写它的简短方法是什么?

这似乎不是很短 - 我不知道这是否正确:

if (type && parent)
    query = { parent: parent };
else if (type && !parent)
    query = { type: type };
else
    query = {};

第一个条件运算符 (?) 的两个表达式将是 (parent) ? { parent: parent } : { type: type } 和最后一个表达式 {}.

的结果

它的工作方式是

var a  = 1, b = 2;
console.log( a == 1 ? b == 2 ? 3 : 2 : 1 );//outputs 3 
console.log( a == 2 ? b == 2 ? 3 : 2 : 1 );//outputs 1 
console.log( a == 1 ? b == 1 ? 3 : 2 : 1 );//outputs 2 

因此,首先评估 a==1,然后进入第二个 b==2

所以,你需要做

if ( type )
{
   if (parent)
   {
     query = { parent: parent };
   }
   else
   {
     query = { type: type };
   }
}
else
{
     query = {};
}

这个怎么样:

var query = {};

if (type){
    if(parent){
        query = {parent: parent};
    }else{
        query = {type: type};
    }
}

嵌套的三元运算符通常可读性不强。你的例子相对简单。但是,当以不同方式嵌套运算符时,您必须 知道执行顺序才能正确理解它。例如(借自here):

a == b ? a : b ? c : d 

您是否清楚这将如何执行?是吗

(a == b ? a : b) ? c : d 

a == b ? a : (b ? c : d) 

?在 JavaScript 中,三元运算符是 right associative,这意味着它的计算结果是后者。在某些编程语言中,三元运算符不是右结合的,而是左结合的。这表明嵌套三元运算符可能会造成混淆,因此应该避免或通过添加括号明确地完成。


如果您想要针对您的特定问题的专线,您可以使用:

var query = (type && parent && {parent:parent}) || (type && {type:type}) || {};

但是,我认为以下内容更具可读性:

var query = {};
if (type) {
    query = parent ? { parent: parent } : { type: type };
}