一个有点痛苦的三重嵌套三元运算符

时间:2012-05-10 02:22:10

标签: javascript if-statement ternary-operator

我查看Raphael.js的源代码,了解他如何将RGB值转换为HSB。我发现了他所做的功能,当我碰到这个漂亮的三嵌套三元运算符时,我正在将它转换为Python:

H = (C == 0 ? null :
    V == r ? (g - b) / C :
    V == g ? (b - r) / C + 2 :
             (r - g) / C + 4
    );

它让我循环,因为Python没有与Javascript相同的三元运算符。我花了一段时间查看它并最终将这个有点理智的代码(仅使用if / else)从中删除:

if (C == 0) {
    H = null;
} else {
    if(V == r) {
        H = (g - b) / C;
    } else {
        if(V == g) {
            H = (b - r) / C + 2;
        } else {
            H = (r - g) / C + 4;
        }
    }
}

我的解释是否正确?我只是问这个,因为如果它不正确,我面临着一个很多的调试。所以。我“明白了”吗?

9 个答案:

答案 0 :(得分:25)

我认为你可以避免深度嵌套:

var H

if(C == 0){
    H = null;
}
else if(V == r){
    H = (g - b) / C;
}
else if (V == g){
    H = (b - r) / C + 2;
}
else {
    H = (r - g) / C + 4;
}

答案 1 :(得分:24)

根据我的个人喜好,一个精心对齐的嵌套三元组击败了if-esle mess:

const H =
  C == 0 ? null            :
  V == r ? (g - b) / C     :
  V == g ? (b - r) / C + 2 :
           (r - g) / C + 4 ;

答案 2 :(得分:6)

H = C == 0 
    ? null 
    : V == r 
        ? (g - b) / C 
        : V == g 
            ? (b - r) / C + 2 
            : (r - g) / C + 4

我见过Dan Abramov使用这种缩进放置模式。虽然我不喜欢条件运算符?如何不再在视觉上遵循条件,但我更喜欢@Lolmaus的例子,因为无论大小如何,缩进都将始终保持一致。有条件的。

您实际上开始将其视为? true : false,这在视觉上是直观的。通过这种方式,我发现三元组更容易发现并区别于周围的代码。

答案 3 :(得分:5)

可以用更简单的方式编写相同的逻辑:

var H

if (C == 0)
    H = null;
else if (V == r)
    H = (g - b) / C;
else if (V == g)
    H = (b - r) / C + 2;
else
    H = (r - g) / C + 4;

可以省略花括号,因为每个条件中都有一个语句。鉴于条件是互斥的,使用else if比嵌套if更清晰。

答案 4 :(得分:2)

是的,这是正确的(除了资本化差异)。然而,它可能更清晰,没有任何括号,可读如下:

if (C == 0)
    h = null;
else if (V == r)
    h = (g - b) / C;
else if (V == g)
    h = (b - r) / C + 2;
else
    h = (r - g) / C + 4;

答案 5 :(得分:2)

如果您的JavaScript代码库包含有问题的嵌套三元语句,请考虑将格式转换为daisy chained ternary statements

H = (C == 0)           // Is C zero?
    ? null
    : (V == r)         // Is V equal to r?
    ? (g - b) / C
    : (V == g)         // Is V equal to g?
    ? (b - r) / C + 2
    : (r - g) / C + 4; // Fallback (default) value
  

他们只是直线从上到下阅读,返回一个值   一旦他们遇到真正的情况或后退。

     

- Nested Ternaries are Great ,Eric Elliot

答案 6 :(得分:1)

这是另一个更优雅的主意...

if (C != 0) 
{
  if (V == r) return (g - b) / C;
  if (V == g) return (b - r) / C + 2;
  return (r - g) / C + 4;
}

return null;

只需将其包装在函数中,然后使用它代替H ...

答案 7 :(得分:0)

MDN Docs中所述:

function example(…) {
    return condition1 ? value1
         : condition2 ? value2
         : condition3 ? value3
         : value4;
}

// Equivalent to:

function example(…) {
    if (condition1) { return value1; }
    else if (condition2) { return value2; }
    else if (condition3) { return value3; }
    else { return value4; }
}

答案 8 :(得分:0)

为什么不使用Python中的三元运算符?

H = (
    None            if C == 0 else
    (g - b) / C     if V == r else
    (b - r) / C + 2 if V == g else
    (r - g) / C + 4
)