【问题标题】:Javascript - How do I find out which condition(s) triggered? [duplicate]Javascript - 我如何找出触发了哪些条件? [复制]
【发布时间】:2017-03-31 00:43:57
【问题描述】:

假设我有以下声明:

if (height > 4.25 || length > 6 || weight > 1) {
  //Do Something
}

有没有办法判断满足了哪些条件才能使该陈述为真?

比下面更优雅的东西,显然是多余的:

if (height > 4.25 || length > 6 || weight > 1) {
  if (height > 4.25){...};
  if (length > 6){...};
  if (weight > 1){...};
}

【问题讨论】:

  • 把这个放到一个函数里,一个一个的检查,从第一个if返回,就是true
  • 无论如何,最终你可能会写 3 个 If 语句,因为所有三个参数都不同(高度、长度和重量)
  • 这在codereview.stackexchange.com 上会更好,因为您有工作代码并且正在就如何重写它征求意见。
  • 没有迹象表明在外部if 但在内部ifs 之外需要发生什么。这是为什么?这不是解决方案的重要组成部分吗?您是否有理由不将所有三个的结果放入变量中,然后根据需要使用它们?为什么这种通用方法不够“优雅”?我们如何知道我们是否提供了“更优雅”的解决方案?这里没有足够的细节。
  • @chsdk:这就是这些“让我的代码更好/更优雅” 问题的问题所在。它们过于宽泛且完全主观,这就是为什么它们离题且不应该回答的原因。有一些功能性解决方案可能会有所帮助并且非常简洁,只是这个问题仍然缺乏细节。

标签: javascript


【解决方案1】:

不可能!

您必须在单独的条件下检查每个选项:

if (height > 4.25 || length > 6 || weight > 1) {

 if(height > 4.25){
  return true;
 }

 if(length > 6){
  return true;
 }

 if (weight > 1){
  return true;
 };

}

即使这样你也不会知道当高度大于 4.25 时长度是否不大于 6,要知道这些你必须检查所有可能的组合:

 if (height > 4.25 || length > 6 || weight > 1) {

     if(height > 4.25 && length > 6 &&  weight > 1){
      return true;
     }

     if(height > 4.25 && length > 6){
      return true;
     }

       //and so on...

    }

【讨论】:

    【解决方案2】:

    我想我会这样做:

    let height = 2;
    let length = 2;
    let weight = 2;
    
    var conditions = [
    {name: "con1",con: (height > 4.25)},
    {name: "con2",con: (length > 6)},
    {name: "con3",con: (weight > 1)}
    ]
    
    conditions.forEach(function(value, key){
    if(value.con)
    {
    console.log(value.name+" was triggered")
    }
    })
    

    【讨论】:

      【解决方案3】:

      你可以滥用 switch 构造:

      var height = 4;
      var length = 7;
      var weight= 1;
      switch(true) {
      case (height > 4.25):
        alert(1);
        break;
       case (length > 6):
         alert(2);
        break;
      case (weight > 1):
        alert(3);
        break;
      default:
        alert(4);
      }
      

      【讨论】:

      • 仅当其中一个条件为真时才有效。
      • 这是如何改进的?为什么不直接使用if/else if
      • 输入愚蠢的问题,输出愚蠢的答案。
      • 这很好,直到人们开始像他们那样投票支持它,这意味着我们必须投票反对它,这样新手才不会混淆为什么这是一个好的解决方案。
      【解决方案4】:

      您始终可以将条件检查分配给变量。 像这样:

      function dimension(height, length, weight) {
          var param = {};
          if ((param.height = height > 4.25) || (param.length = length > 6) || (param.weight = weight > 1)) {
              console.log(param);
              //if (param.height) dosomething_with_height(height);
              //if (param.length) dosomething_with_length(length);
              //if (param.weight) dosomething_with_weight(weight);
          }
      }
      

      但你知道,由于它的 if-or 条件,当满足某些条件时,不检查下一个条件。

      所以如果满足身高条件,那么长度和重量是不确定的。 或者如果满足长度条件,则高度为假,但重量未定义。

      【讨论】:

      • 答案和我的一样!!
      • @chsdk 抱歉,我没有检查每个答案。只发布我所知道的
      • 是的,最好在 15 分钟后检查哪个答案有效,投反对票,尝试优化,然后发布类似的答案。打得很好。
      • @chsdk 不,我不在乎对我的帖子投票,只要 op/谁能读懂我的。我只是分享我的知识,我不期望任何回报(包括投票)
      • 太好了,你说服了我。
      猜你喜欢
      • 2011-04-16
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-04
      • 1970-01-01
      • 1970-01-01
      • 2020-06-19
      相关资源
      最近更新 更多