【问题标题】:Elegant way of checking if a value is within a range and setting it's value if it falls outside of the range?检查一个值是否在一个范围内并在它超出范围时设置它的值的优雅方法?
【发布时间】:2012-10-12 12:59:50
【问题描述】:

我想做的事情本身很简单,但我想知道是否有一些非常简洁紧凑的方式来完成同样的事情。

我有一个浮点变量,我想检查它的值是否在 0 和 1 之间。如果它小于 0,我想将其设置为零,如果它大于 1,我想将其设置为 1。

通常我会这样做:

// var myVar is set before by some calculation

if(myVar > 1){
    myVar = 1;
}
if(myVar < 0){ 
    myVar = 0;
}

有谁知道这样做的更优雅/紧凑的方式?

【问题讨论】:

    标签: javascript coding-style


    【解决方案1】:

    一种可能的解决方案:

    myVar = Math.min(1, Math.max(0, myVar));
    

    另一个:

    myVar = myVar < 0 ? 0 : myVar > 1 ? 1 : myVar;
    

    【讨论】:

    • 如果你使用三元组,至少把 else 条件括起来 - 一行中的多个三元组会非常混乱,很快
    • Math.min Math.max 解决方案很好,我认为我会使用它!我会在 10 分钟内接受。
    【解决方案2】:

    使用 Math.min 和 Math.max,避免出现条件。

    var MAX = 100;
    var MIN = 50;
    
    var val = 75;
    console.log( Math.max(MIN, Math.min(MAX, val)) );
    
    var val = 49;
    console.log( Math.max(MIN, Math.min(MAX, val)) );
    
    var val = 101;
    console.log( Math.max(MIN, Math.min(MAX, val)) );
    

    【讨论】:

      【解决方案3】:

      虽然 Min/Max 解决方案非常简洁,但远非显而易见。

      我会选择一个能满足你的功能:

      myVar = constrainToRange(myVar, 0, 1);
      
      function constrainToRange(x, min, max) {
          if (x < min) {
              x = min;
          }
          else if( x > max) {
              x = max;
          }
          return x;
      }
      

      【讨论】:

      • +1 难以超越此解决方案的清晰度。我正要建议“约束”,但你打败了我。 :) 您甚至可以将其添加到 Number.prototype 作为选项。
      • 这么多代码....Number.prototype.constrain=function(x,min,max) {if (x&lt;min)return min;if (x&gt;max)return max;return x;}
      • 我选择了这个,结合 user1689607 的建议,这为我的问题提供了一个非常清晰和干净的解决方案。
      • @mplungjan 如果您要跨多行写出它,您将拥有完全相同数量的代码,因为我总是使用大括号。如果 Jeroen 喜欢不同的风格,欢迎他进行调整。
      • 我省略了 else 和括号 :)
      【解决方案4】:

      这是一个可以很容易扩展以测试比简单的最小值/最大值更多的选项:

      myVar = parseFloat( (myVar < 0 && '0') || (myVar > 1 && 1) || myVar );
      

      parseFloat 并以字符串形式返回 0 很重要,否则当它应该停在那里时,它会通过该条件。

      【讨论】:

        【解决方案5】:

        也许是这样的:

         myVal = myVal >= 1 ? 1 : Math.min(Math.abs(myVal), 0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多