【问题标题】:How to check if a number is between two values?如何检查一个数字是否在两个值之间?
【发布时间】:2013-02-05 22:56:54
【问题描述】:

在 JavaScript 中,如果窗口大小大于 500 像素,我会告诉浏览器执行一些操作。我是这样做的:

if (windowsize > 500) {
    // do this
}

这很好用,但我想应用同样的方法,但要使用一系列数字。所以我想告诉我的浏览器在窗口大小在 500px 到 600px 之间时做些什么。我知道这行不通,但这是我的想象:

if (windowsize > 500-600) {
    // do this
}

在 JavaScript 中这是否可能?

【问题讨论】:

标签: javascript


【解决方案1】:

测试windowsize 是否大于500 且小于600,这意味着500600 本身的值都不会导致条件变为真。

if (windowsize > 500 && windowsize < 600) {
  // ...
}

【讨论】:

  • 感谢 undefined,只是为了确认当窗口大小大于 500 像素且小于 600 像素时,这将在浏览器中执行我想要的操作,基本上只在 500-600 像素的范围内运行,对吗? (我不太擅长这些东西哈哈)
  • @Dyck 是的,确实如此 :),请注意 jQuery 只是一个 JavaScript 库。
  • 请注意,仅当windowsize 至少为 501px 且最多为 599px 时,此条件才成立。 500px 和 600px 被排除在外。如果您想包含这些值,请在比较中添加相等性。
  • 只是一个细节,但以下方式更具可读性:if(500 &lt; windowsize &amp;&amp; windowsize &lt; 600)
  • 哇,这太神奇了!
【解决方案2】:

我有一点时间,所以,虽然你已经接受了一个答案,但我想我会贡献以下内容:

Number.prototype.between = function(a, b) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

JS Fiddle demo.

或者,如果您希望选择检查数字是否在定义的范围内包括端点

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min.apply(Math, [a, b]),
    max = Math.max.apply(Math, [a, b]);
  return inclusive ? this >= min && this <= max : this > min && this < max;
};

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

JS Fiddle demo.

鉴于——正如 cmets 中所述——

Function.prototype.apply() 很慢!除了当你有固定数量的参数时调用它是没有意义的......

值得删除 Function.prototype.apply() 的使用,它产生了上述方法的修改版本,首先没有“包含”选项:

Number.prototype.between = function(a, b) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return this > min && this < max;
};

var windowSize = 550;

console.log(windowSize.between(500, 600));

JS Fiddle demo.

还有“包容性”选项:

Number.prototype.between = function(a, b, inclusive) {
  var min = Math.min(a, b),
    max = Math.max(a, b);

  return inclusive ? this >= min && this <= max : this > min && this < max;
}

var windowSize = 500;

console.log(windowSize.between(500, 603, true));

JS Fiddle demo.

参考资料:

【讨论】:

  • 为什么使用apply而不是像Main.min(a,b)那样直接调用? Function.prototype.apply 很慢!除了当你有固定数量的参数时调用它是没有意义的。
  • 我将把它添加到我的默认工具箱中 - 非常方便,感谢您的贡献!
  • @SteelBrain:你说得有道理!我已经更新了答案以反映这一点,尽管我怀疑我有 - 最初 - 使用 Function.prototype.apply()原因,但我想不出它是什么,或者可能是什么。
  • 最好创建一个不修改Number 对象的函数。这是一种反模式,如果 ECMA 标准更改为包含 Number.between() 函数,或者如果另一个库或另一段代码在其他地方用不同的定义定义了 Number.prototype.between,它会来咬你。相反,创建一个辅助函数并使用它!
  • @MonarchWadia 虽然您的观点是有道理的,即修改/扩展原生对象是不好的做法,但我觉得到处宣扬这种做法有点多余(无意冒犯)。我数不清我见过“不要修改本机对象”的次数。对我来说,这就像有人出售家用刀具,每次他/她出售一把家用刀具时都会警告买家刀具可能存在的危险,如果有任何伤害,卖家应承担责任。危险应该是常识。是否忽略它们应该取决于用户。
【解决方案3】:

我更喜欢将变量放在里面,以提供额外的提示,即代码正在验证我的变量是否在一个范围值之间

if (500 < size && size < 600) { doStuff(); }

【讨论】:

  • 这是我的偏好,因为它更接近 python 的 min &lt; testval &lt; max 语法
  • @GouravChawla 您是在谈论此答案中的代码 sn-p 示例吗?我的代码 sn-p 是 Python,用于比较
  • @GouravChawla 没有人说别的。目前尚不清楚您不同意什么。
【解决方案4】:

这是一个老问题,但可能对像我这样的人有用。

lodash具有_.inRange()功能https://lodash.com/docs/4.17.4#inRange

例子:

_.inRange(3, 2, 4);
// => true

请注意,此方法使用 Lodash 实用程序库,并且需要访问已安装的 Lodash 版本。

【讨论】:

  • 请注意不包括最终值。例如。 _.inRange(10, 0, 10) // =&gt; false
  • 由于 OP 将问题范围限制为 Javascript,值得注意的是,此方法利用了 Lodash 实用程序库,并且需要访问已安装的 Lodash 版本。
【解决方案5】:

您可以在if 条件中使用Multiple 子句而不是写

if (windowsize > 500-600) {
    // do this
}

因为这真的没有意义 从逻辑上讲,JavaScript 会读取您的 if 条件,例如

windowSize > -100 

因为它会将500-600 计算为-100

您应该使用&amp;&amp; 来严格检查这两种情况,例如看起来像这样

if( windowSize > 500 && windowSize < 600 ){

// Then doo something

}

【讨论】:

    【解决方案6】:

    这是一个通用方法,你可以在任何地方使用

    const isBetween = (num1,num2,value) => value > num1 && value < num2 
    

    【讨论】:

      【解决方案7】:

      你可以简单地做到这一点

      if (windowsize > 500 && windowsize < 600) {
      //your logic
      }
      

      或者如果你想要干净的代码你可以在你的主js文件中任何常见的地方编写你自己的函数。

      Number.prototype.between = function(a, b) {
       var min = Math.min.apply(Math, [a, b]),
          max = Math.max.apply(Math, [a, b]);
        return this > min && this < max;
      };
      

      那你就可以这样称呼了

      if(windowsize.between(500, 600)){
       //your logic
      }
      

      【讨论】:

        【解决方案8】:

        这是可能的最短方法:

        if (Math.abs(v-550)<50) console.log('short')
        if ((v-500)*(v-600)<0) console.log('short')
        

        参数化:

        if (Math.abs(v-max+v-min)<max+min) console.log('short')
        if ((v-min)*(v-max)<0) console.log('short')
        

        如果你不明白第一个是如何工作的,你可以将两边除以 2;)

        【讨论】:

          【解决方案9】:

          我刚刚实现了这一点 jQuery 来显示和隐藏引导模式值。根据用户文本框条目的取值范围显示不同的字段。

          $(document).ready(function () {
              jQuery.noConflict();
              var Ammount = document.getElementById('Ammount');
          
              $("#addtocart").click(function () {
          
                      if ($(Ammount).val() >= 250 && $(Ammount).val() <= 499) {
                          {
                              $('#myModal').modal();
                              $("#myModalLabelbronze").show();
                              $("#myModalLabelsilver").hide();
                              $("#myModalLabelgold").hide();
                              $("#myModalPbronze").show();
                              $("#myModalPSilver").hide();
                              $("#myModalPGold").hide();
                          }
                      }
              });
          

          【讨论】:

          • 在 2013 年使用 jQuery 处理琐碎的函数可能是一种选择,但现在不是
          • 没错,但恐怕今天人们仍然会使用它
          • 出于好奇:为什么现在用 jQuery 来处理琐碎的函数比那时更糟糕?
          • @Julix 主要是性能,尽管在这种情况下可以忽略不计。一般的观点是“不要在没有必要时使用 jQuery”,但这些 cmets 不是(重新)开始辩论的地方。不过玩得开心:) i.stack.imgur.com/sGhaO.gif
          • 这只是解决方案的一个实现。 OP 已经可以访问这些值。所以 jQuery $().val() 是无关紧要的,也没有必要。但同样,在问题的原始版本中,OP 提到了 jQuery,用于简单的算术检查。 (叹气)这是第一个错误。
          【解决方案10】:

          就像大卫的回答一样,但我需要 a 或 b 的包容性。所以我的溶胶:

          export const between = (num: number, a: number, b: number, inclusiveA = true, inclusiveB = true): boolean => {
            if (a > b) [a, b, inclusiveA, inclusiveB] = [b, a, inclusiveB, inclusiveA];
            if (a == b && (inclusiveA || inclusiveB)) [inclusiveA, inclusiveB] = [true, true];
            return (inclusiveA ? num >= a : num > a) && (inclusiveB ? num <= b : num < b);
          };
          
          if (require.main === module) {
            console.log(between(12, 15, 10)); //true
            console.log(between(15, 15, 10)); //true
            console.log(between(15, 10, 15)); //true
            console.log(between(10, 10, 15, false)); //false
            console.log(between(15, 10, 10, true, false)); //false
            
            //edge case: if a==b then enough that either of the edges is inclusive
            console.log(between(10, 10, 10, true, false)); //true
          }
          
          

          它也是打字稿而不是 javascript

          【讨论】:

            【解决方案11】:

              function handleBetween(number, calc) {
                    let [a, b] = calc;
                    let min = Math.min(a, b), max = Math.max(a, b);
                    return number > min && number < max;
                }
            
                if(510 >500 && 510 <600){
                console.log(`510 >500 && 510 <600 is true`)
                }
            
            
                if(610 >500 && 610 <600){
                // false
                console.log(`610 >500 && 610 <600 is true`)
                } else console.log(`610 >500 && 610 <600 is false`)
            
            
                
                 console.log(handleBetween(510, [500, 600])); // true
                 console.log(handleBetween(610, [500, 600])); // false

            【讨论】:

              【解决方案12】:

              我知道有一个公认的答案,但我想提供一些在某些情况下有用的方法。如果我们想检查n是否在xy之间,我们可以这样做:

              x <= n && n <= y
              (x - n) * (y - n) <= 0
              

              当您尝试获得相同的结果时,第二个非常有用,即使您交换 xy

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2010-12-31
                • 2013-09-06
                • 1970-01-01
                • 2022-03-30
                • 1970-01-01
                • 2022-01-20
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多