JavaScript中检查数字是否在范围内的最短代码

7

这是我检查一个数字是否在范围内(在两个其他数字之间)的方法:

var a = 10,
    b = 30,
    x = 15,
    y = 35;

x < Math.max(a,b) && x > Math.min(a,b) // -> true
y < Math.max(a,b) && y > Math.min(a,b) // -> false

我在代码中需要经常进行这种数学运算,现在想要寻找更短的等效代码。

这是我想到的一个较短的版本,但我相信它还可以更短:

a < x && x < b
true
a < y && y < b
false

但是缺点是我必须重复xy


@NullUserException:这是否意味着0在区间1-2中? - Bergi
@Bergi,你的行为实在是太过分了。 - NullUserException
你的简短版本是错误的:http://jsfiddle.net/Fm39z/ - ajax333221
4个回答

23
Number.prototype.between = function (min, max) {
    return this > min && this < max;
};

if ((5).between(4, 6)) {
    alert('worked!');
}

var num = 6;
if (num.between(5, 7)) {
    alert('still worked!');
}

请注意,您需要用括号将数字文字括起来,否则解析器会认为您的属性是小数点并崩溃。

http://jsfiddle.net/jbabey/4jjRm/1/


显然,只有在正确的顺序下传递数字才能使其正常工作。 - NullUserException
1
@NullUserException:您可以轻松地通过以下代码行添加该功能:if(max<min) return this.between(max, min); - Bergi
4
这是一个漂亮的解决方案,但修改本地类型/对象并不可取(可以称其为任何名称)。这个主题有一些文章,例如http://perfectionkills.com/whats-wrong-with-extending-the-dom/。 - Andris
1
@Andris Number 不是 DOM 原生对象,而是 JavaScript 原生对象。我认为大多数人都同意扩展 JavaScript 原生对象(ObjectNumberFunction 等)是可以的。 - jbabey
我同意。扩展对象是最好的方法。这是最干净和最有效的解决方案。 - amustill
2
无论使用DOM或不使用DOM,您都修改了默认功能。当然,向数组或数字等对象添加自定义方法很容易,但是如果您切换到另一个代码库,它可能没有该功能,这会让您感到困惑。jQuery之所以不像Prototype那样实现某些功能,是有原因的,尽管它可以做到... - Andris

2
如果我需要频繁地执行此操作,我会编写一个名为inRange(a, b, x)的函数,这样每次需要时只需调用这个短函数。这样,您也可以在不担心长度的情况下使函数体稍微明晰些。

0

我修改了上面的代码,因为它不能很好地进行排序。 这是对我完美有效的代码(包括范围结束):

var isNumberInRange = (num1, num2, testNum) => {
  var min, max;
  [min, max] = [num1, num2].sort((a, b) => a - b);
  return (testNum >= min && testNum <= max);
}; 

0
如果您需要灵活地测试一个数字是否在两个数字之间,而不必先找到最小值和最大值:
let inRange = (num1, num2, numTest) => {
  [min, max] = [num1, num2].sort((a, b) => a > b);
  return numTest > min && numTest < max;
}

从低到高进行测试:

inRange(1, 5, 3); // true
inRange(1, 5, 6); // false

从高到低进行测试:

inRange(5, 1, 3); // true
inRange(5, 1, 6); // false

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接