如何使用 JavaScript 限制最小值/最大值之间的数字?

Posted

技术标签:

【中文标题】如何使用 JavaScript 限制最小值/最大值之间的数字?【英文标题】:How can I use JavaScript to limit a number between a min/max value? 【发布时间】:2011-08-16 02:40:18 【问题描述】:

我想限制两个值之间的数字,我知道在 php 中你可以这样做:

$number = min(max(intval($number), 1), 20);
// this will make $number 1 if it's lower than 1, and 20 if it's higher than 20

我怎样才能在 javascript 中做到这一点,而不必编写多个 if 语句和类似的东西?谢谢。

【问题讨论】:

【参考方案1】:

喜欢这个

var number = Math.min(Math.max(parseInt(number), 1), 20);

现场演示:

function limitNumberWithinRange(num, min, max)
  const MIN = min || 1;
  const MAX = max || 20;
  const parsed = parseInt(num)
  return Math.min(Math.max(parsed, MIN), MAX)


alert(
  limitNumberWithinRange(  prompt("enter a number")   )
)

【讨论】:

做 Javascript 具有 intval(num) 功能。因为我只知道parseInt(num) 现在我们的答案是相同的,所以我要删除我的。 除非你知道自己在做什么,否则不要使用parseInt,例如parseInt(1e300) === 1。只需使用Math.min(Math.max(number, 1), 20) @Sandwich 关注Math.max(number, 1)。这是number1 中的最大值。所以当number > 1 时是number,当number <= 1 时是1。即它总是大于或等于1,不管number是什么,只要number是数字(Math.max可以在number不是数字时返回NaN); Math.max 将最小限制 设置为1Math.min 以同样的方式将最大限制设置为20 @Sandwich 记住,Math.minMath.max 不是 Math.setMinimumLimitMath.setMaximumLimit。不要混淆。【参考方案2】:

您至少有两个选择:

您可以使用一对条件运算符 (? :):

number = number > 100 ? 100 : number < 0 ? 0 : number;

或者你可以结合Math.maxMath.min

number = Math.min(100, Math.max(0, number));

在这两种情况下,你都比较容易混淆,所以如果你在多个地方这样做,你可能会考虑使用实用函数:

function clamp(val, min, max) 
    return val > max ? max : val < min ? min : val;

然后:

number = clamp(number, 0, 100);

【讨论】:

【参考方案3】:

使用lodash的clamp方法:

_.clamp(22, 1, 20) // Outputs 20

【讨论】:

这就是我想要的。谢谢【参考方案4】:

无需解释:

function clamp(value, min, max) 
    return Math.min(Math.max(value, min), max);

【讨论】:

这是否适用于负数,例如 transform -xdeg? @RyanStone “转换 -xdeg” 是什么意思?它也适用于负值,是的。您可以拨打clamp(-5, -1, 1),它会返回-1 意思是在 Css Transform:rotateX(); 中使用它它接受负值.. 通过 Javascript【参考方案5】:

相关:What's the most elegant way to cap a number to a segment?:

ECMAScript 2017 更新:

Math.clamp(x, lower, upper)

但请注意,截至今天,它是第 1 阶段 proposal。在它得到广泛支持之前,您可以使用polyfill。

【讨论】:

【参考方案6】:

我将分享我的强大功能来强制执行整数(因为integer 标签),它具有可选的最小/最大参数和-0 保护等功能:

function toInt(val, min, max)
    val=(val*1 || 0);
    val=(val<0 ? Math.ceil(val) : Math.floor(val));

    min*=1;
    max*=1;

    min=((Number.isNaN(min) ? -Infinity : min) || 0);
    max=((Number.isNaN(max) ? Infinity : max) || 0);

    return Math.min(Math.max(val, min), max);

一些快速说明:

幕后的(... || 0) 正在处理-0 以将其更改为0,这几乎总是你想要的。 minmax 参数是可选的。当传递空白或无效值时,它们将变为-InfinityInfinity,因此它们不会干扰Math.min()Math.max()。 您可以将Number.isNaN(x) ECMAScript-6 更改为x!==x(结果仅适用于NaN)以获得与真正旧浏览器的更多兼容性,但这不再是必需的了。

【讨论】:

【参考方案7】:

您可以通过添加自己的方法轻松扩展 Math...

ES6

Math.minmax = (value, min, max) => Math.min(Math.max(value, min), max);

ES5

Math.minmax = function(value, min, max)
    return Math.min(Math.max(value, min), max);

【讨论】:

【参考方案8】:

使用Math.minMath.max

【讨论】:

以上是关于如何使用 JavaScript 限制最小值/最大值之间的数字?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript设置日期的最小值和最大值属性

javascript如何获取数组中的最大值和最小值

Javascript:使用 reduce() 查找最小值和最大值?

Javascript 如何取最大值?

RatingBar如何设置评分最小值?

如何设置Maven的minimum(最小值)?