避免嵌套三元组

时间:2016-07-16 10:10:06

标签: javascript ternary-operator

我写了这样的代码:

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

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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

你是否明白这将如何执行?是吗

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

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

?在JavaScript中,三元运算符是right associative,这意味着它对后者进行求值。在某些编程语言中,三元运算符不正确,而是左关联。这表明嵌套三元运算符可能会令人困惑,因此应该通过添加括号来避免或明确地完成。

如果您想要针对特定​​问题使用oneliner,可以使用:

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

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

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

答案 1 :(得分:0)

First条件运算符(?)的两个表达式将是(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 = {};
}

答案 2 :(得分:0)

这个怎么样:

var query = {};

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