是否可以在条件(三元)中放置switch语句?

时间:2017-11-25 16:21:54

标签: javascript ecmascript-6

我真的很喜欢使用Conditional(三元)运算符。是否可以在此运算符中放置switch语句?

这是我试过的:

function find(cn, romanNum) {
        if (cn >= 1 && cn <= 3) {
          return repeatString(romanNum[2], cn);
       }
        cn > 5 && cn < 9 ? return romanNum[1] + repeatString(romanNum[2], cn - 5) : switch(cn) {
            case 4:
            return romanNum[2] + romanNum[1];
            case 5: 
            return romanNum[1];
            case 9:
            return romanNum[2] + romanNum[0];
    }
}

我知道我做错了什么,但它是什么?每个人在某个时间点都是新事物。

错误:

  • 预期标识符,而是看到'return'
  • 预计':'而是看到'romanNum'
  • 缺少分号。
  • 预计'}'与第58行的'{'匹配,而是看到':'

这是正确的es5代码:

function find(cn, romanNum) {
        if (cn >= 1 && cn <= 3) {
            return repeatString(romanNum[2], cn);
        } else if (cn == 4) {
            return romanNum[2] + romanNum[1];
        } else if (cn == 5) {
            return romanNum[1];
        } else if (cn == 9) {
            return romanNum[2] + romanNum[0];
        }
        if (cn > 5 && cn < 9) {
            return romanNum[1] + repeatString(romanNum[2], cn - 5);
        }
    }

帮助?

4 个答案:

答案 0 :(得分:3)

tl; dr:有点,但你不应该这样做因为它不那么可读。
始终保持代码简洁,简单但冗长。

答案很长: 您可以将开关包装在一个立即调用的匿名函数中。

const a = 20;
const condition = a > 100;
const result = condition ? true : ( () => {
  switch ( a ) {
    case 11: return 22;
    case 20: return 21;
    default: return 100;
  }
} )();

console.log( result );

但这不仅更复杂,而且更难阅读。

最好使用详细的编码风格。 在你的情况下,这样的东西会更清晰,更具可读性:

function test( a ) {
  const condition = a > 100;

  if ( condition ) {
    return true;
  }
  
  switch ( a ) {
    case 20: return 21;
    default: return 100;
  }
}

console.log( test( 20 ) );

答案 1 :(得分:2)

您可以使用IIFE:

return condition
  ? (() => {
      switch (val) {
        case x: return a;
        case y: return b;
        default: return c;
      }
    })()
  : other;

然而,这是非常难以理解的,甚至不比简单的if陈述短。

也就是说,有一个比switch更好的选择来查找值:查找表!只需使用对象,数组或Map,并使用cn作为属性名称。

const table = {
  1: repeatString(romanNum[2], 1),
  2: repeatString(romanNum[2], 2),
  3: repeatString(romanNum[2], 3),
  4: romanNum[2] + romanNum[1],
  5: romanNum[1],
  6: romanNum[1] + repeatString(romanNum[2], 1),
  7: romanNum[1] + repeatString(romanNum[2], 2),
  8: romanNum[1] + repeatString(romanNum[2], 3),
  9: romanNum[2] + romanNum[0]
};
function find(cn) {
  return table[cn];
}

// using an array similar to the object above:
table = [
  ...Array.from({length: 4}, (_, i) => repeatString(romanNum[2], i))
  romanNum[2] + romanNum[1],
  ...Array.from({length: 4}, (_, i) => romanNum[1] +  repeatString(romanNum[2], i)),
  romanNum[2] + romanNum[0]
];

答案 2 :(得分:1)

您可以使用嵌套的三元组作为对象替换select结构。

function find(cn, romanNum) {
    return cn >= 1 && cn <= 3
        ? repeatString(romanNum[2], cn)
        : cn > 5 && cn < 9
            ? romanNum[1] + repeatString(romanNum[2], cn - 5)
            : {
                4: romanNum[2] + romanNum[1],
                5: romanNum[1],
                9: romanNum[2] + romanNum[0]
            }[cn];
}

更进一步,您可以省略第二个三元组,并使用第一个条件作为对象不存在属性的结果的默认值。

function find(cn, romanNum) {
    return cn >= 1 && cn <= 3
        ? repeatString(romanNum[2], cn)
        : {
            4: romanNum[2] + romanNum[1],
            5: romanNum[1],
            9: romanNum[2] + romanNum[0]
        }[cn] || romanNum[1] + repeatString(romanNum[2], cn - 5);
}

答案 3 :(得分:1)

  1. 你不能使用这样的返回只是一个小例子来说明如何在普通的三元运算符中返回

    function find(cn, romanNum) {
        if (cn >= 1 && cn <= 3) {
         return 2;
       }
    
      return  (cn > 5 && cn < 9) ? ( romanNum[1] + 2, cn - 5) : 3
    

    }

  2. 不能在三元运算符中使用switch语句,因为switch是一个语句而不是条件或表达式

  3. 如果-else

  4. ,请更好地使用
  5. 如果您想坚持三元组,请进行更改,如

  6. function find(cn, romanNum) {
            if (cn >= 1 && cn <= 3) {
              return repeatString(romanNum[2], cn);
           }
          return  cn > 5 && cn < 9 ?  romanNum[1] + repeatString(romanNum[2], cn - 5) : (cn===4 ?   romanNum[2] + romanNum[1]:
              (cn==5 ? romanNum[1] : romanNum[2] + romanNum[0]))
    }
    
    console.log(find(2,[1,2,3,4]))

    虽然我不喜欢嵌套的三元运算符,因为它阻碍了代码的可读性。