【问题标题】:javascript ternary operator "chaining"javascript 三元运算符“链接”
【发布时间】:2016-01-15 12:24:32
【问题描述】:

我正在尝试使用三元运算符编写类似的东西(由于 jsx 语法限制而需要)

if(!this.state.msg) {
    if(this.state.ask.length != 0) {
        // do stuff
    } else {
       // do stuff
    }
    if(this....) {
        //do stuff
    } else {
      // ...
    }
} else {
    //nothing
}

所以我尝试了这个愚蠢的

   !this.state.msg ? this.state.ask.length != 0 ? //do stuff : "" this.state... ? //do stuff : //do other stuff : //nothing

但这显然不是正确的方法。

非常欢迎任何帮助。提前致谢。

【问题讨论】:

  • 只需用“?”替换说 if否则用 ":" 。 OI 会为你写出来。
  • 你的原始代码不是“三元”,因为最初的if没有else
  • true 我编辑了,但还是不行
  • 请不要这样做
  • jsx 语法不允许我有其他选择

标签: javascript ternary-operator


【解决方案1】:

你真正的分支有两个组成部分;您可以用逗号分隔它们(带括号,因为逗号的关联性比三元运算符弱)。所以

!this.state.msg ?
  (
    this.state.ask.length != 0 ? /*stuff*/ : /*stuff*/,
    this... ? /* stuff */ : /* ... */
  ) : /* nothing */

或者,由于 else 分支“什么都不做”,您可以将顶层的三元运算符替换为简单的 and:

!this.state.msg &&
  (
    this.state.ask.length != 0 ? /*stuff*/ : /*stuff*/,
    this... ? /* stuff */ : /* ... */
  )

【讨论】:

    【解决方案2】:

    你断言 JSX 以这种方式限制你是错误的 - 阅读这个doc page,你会发现你可以使用这样的东西:

    {(() => {
    // My awesome multi-step code
    })()}
    

    【讨论】:

    • @rollingBalls BTW,在您发表评论和发帖之前从未听说过 JSX。所以,当然,我用谷歌搜索了它,谢谢!
    【解决方案3】:

    也许添加另一个视角会有所帮助。您实际上需要在 JSX 中使用三元运算符是非常罕见的。在这种情况下,我会考虑将所有这些逻辑移到一个单独的函数中。

    helperFunction: function() {
      if(!this.state.msg) {
        if(this.state.ask.length != 0) {
          // return stuff
        } else {
          // return stuff
        }
    
        if(this....) {
          // return stuff
        } else {
          // ...
        }
      } else {
        // nothing
      }
    }
    

    然后你就可以在你的渲染方法中使用你的辅助函数了。

    React.createClass({
      helperFunction: function() {
        // ...
      },
      render: function() {
        return (
          <div>
           {this.helperFunction()}
          </div>
        );
      }
    });
    

    您的辅助函数可以返回可用于属性的值,也可以返回其他 JSX 组件。我经常发现将代码移出如下所示的模式很有帮助:

    render: function() {
      return (
        condition === 'example' ?
          <MyComponent attr={this.props.example} onChange={this.props.onChange} /> :
          <MyOtherComponent attr={this.state.example} onChange={this.state.onChange}/>
       );
    }
    

    如下代码:

    helper: function(condition) {
      if(condition === 'example') {
        return (
          <MyComponent attr={this.props.example} onChange={this.props.onChange} />
        );
      }
    
      else {
        return (
          <MyOtherComponent attr={this.state.example} onChange={this.state.onChange}/>
        );
      }
    },
    render: function() {
      return this.helper(condition);
    }
    

    在字符串相等检查的情况下甚至更好。

    helper: function(condition) {
      const default = <MyOtherComponent attr={this.state.example} onChange={this.state.onChange}/>
    
      const conditions = {
        example: <MyComponent attr={this.props.example} onChange={this.props.onChange} />,
        example2: <MyComponent attr={this.props.example} onChange={this.props.onChange} />,
        example3: <MyComponent attr={this.props.example} onChange={this.props.onChange} />,
      };
    
      return conditions[condition] || default;
    },
    render: function() {
      return this.helper(condition);
    }
    

    这种方式为您提供了 switch 语句的大部分功能,但语法也更简洁,它可以让您从大量条件组件中优雅地进行选择。使用 if 语句(常规或三元)编写的相同代码会更加冗长。

    【讨论】:

    • 是的,这就是我通常做的事情,实际上我的代码的一部分是这样制作的,我正在扩展 jsx 的一部分并且懒得把它拿出来...... =/但是是正确的方式一定要去
    【解决方案4】:

    为了冗长、表达清晰和可维护性,我不建议将 if-else 转换为三元表达式。尽量让您的代码保持简单,即使以增加几行代码为代价。

    如果你只是想学习,这里就是

    !this.state.msg ? 
      (this.state.ask.length != 0 ? //do if stuff : //do else stuff),
      (this.some == 0 ? //do 2nd if stuff : //do 2nd else stuff)
    :
    

    【讨论】:

      【解决方案5】:

      将其可视化会有所帮助。

          !this.state.msg ?
                              ? this.state.ask.length != 0) 
                                    // do stuff
                              :
                                    // do stuff
                           :
                           this.... ?
                                     //do stuff
                                    :
                                      // ...
      

      【讨论】:

      • 我总是把它们形象化,然后换掉这些陈述。就是这样,只是简写。
      • 不幸的是,这与原始代码的逻辑不同。当this.state.ask.length != 0 不为真时,您正在执行第二部分,但在原始代码中,当条件为真时,第二部分作为第二条语句执行。
      • 我后来意识到,并认为他们只是在问如何解释逻辑。我实际上应该删除它。谢谢
      • 其实我认为没有办法在不拆分的情况下在三元语句中执行。实际上我把它分开了,所以它现在是合法的三元语法并且它有效。如果有尊重初始逻辑的解决方案,请告诉我,但现在这对我来说是正确的答案。谢谢。
      猜你喜欢
      • 1970-01-01
      • 2016-08-21
      • 2015-07-31
      • 2020-11-03
      • 2020-04-29
      • 2019-11-09
      • 2012-02-11
      • 2016-06-26
      • 1970-01-01
      相关资源
      最近更新 更多