【问题标题】:Ternary statement with multiple results具有多个结果的三元语句
【发布时间】:2020-07-29 09:26:42
【问题描述】:

我有一个函数,我在其中传递了一个 query 参数,它是一个字符串。如果查询不为空,则函数调用 toggleList,布尔值为 true,否则为 false。

我还有一个接受数组的setMovies 函数。如果查询不为空,我想做这个功能。

query ? toggleList(true) : toggleList(false);

if (query) { 
  setMovies([...movies]);
}

但我不能这样做:

query ? (toggleList(true), setMovies([...movies])) : toggleList(false);

是否不可能在三元语句的真值部分调用 2 个函数,因为这样我实现了太多逻辑,我应该只使用普通的 if/else 语句,或者我错过了什么确实让这成为可能

【问题讨论】:

标签: javascript typescript ecmascript-6


【解决方案1】:

只要采取干净的方法。

toggleList(!!query);               // if query is already boolean take it without !!
if (query) setMovies([...movies]);

【讨论】:

  • 你觉得这个query ? (() => { toggleList(true); setMovies([...movies]) })() : toggleList(false);怎么样?如果您知道三元语句,这似乎很简单?
  • @PeterBoomsma,三元返回一个不与您的代码一起使用的表达式。不好跟,直接调用(iife),不想要。
【解决方案2】:

三元运算符用于简单的单行 if/else 情况。 如果您想实现更复杂的逻辑,例如您的案例,请使用标准 if/else。

【讨论】:

    【解决方案3】:

    如果调用的第一个函数有一个错误的返回值 ex undefined 你可以使用 ||运算符同时触发它们

    query ? toggleList(true) || setMovies([...movies]) : toggleList(false);
    

    如果它是真的,你会相应地使用 &&

    query ? toggleList(true) && setMovies([...movies]) : toggleList(false);
    

    例子:

    function f1(){
      console.log("f1");
    }
    
    function f2(){
      console.log("f2");
    }
    
    function f3(){
      console.log("f3");
    }
    
    true ? f1() || f2() : f3(); // logs both f1 and f2
    false ? f1() || f2() : f3(); // logs f3

    【讨论】:

      【解决方案4】:

      你可以使用匿名函数调用

      const func1 = a => console.log('1', a)
      const func2 = b => console.log('2', b)
      
      true
        ? (() => {
            func1('a')
            func2('b')
          })()
        : func2('c')

      const func1 = a => console.log('1', a)
      const func2 = b => console.log('2', b)
      
      true ? (func1(1), func2(2)) : func2(2)

      【讨论】:

      • 底部示例给出:Expected an assignment or function call and instead saw an expression. 这也是我的示例。您的第一个示例确实有效,但比常规 if/else 语句可读性差得多,但感谢您证明它可以完成。
      • @PeterBoomsma 说的是最底层的例子,不知道你用的是什么js环境?我用节点运行底部,在浏览器控制台中仍然看不到任何错误
      • 在 TypeScript 中运行它,所以它可能更严格一些。
      • @PeterBoomsma 如果这只是一个警告,那么您的 lint 规则可能很严格,您可以考虑忽略该行的 lint 检查
      猜你喜欢
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多