什么是最优雅的方式来限制一个数字段?

比方说xab是数字。 我需要将x限制在段[a, b]

我可以写Math.max(a, Math.min(x, b)) ,但是我不觉得它很容易阅读。 有没有人有一个聪明的方式来写这个更可读的方式?

你这样做是相当标准的。 您可以定义一个实用程序clampfunction,如下所述:

 /** * Returns a number whose value is limited to the given range. * * Example: limit the output of this computation to between 0 and 255 * (x * 255).clamp(0, 255) * * @param {Number} min The lower boundary of the output range * @param {Number} max The upper boundary of the output range * @returns A number in the range [min, max] * @type Number */ Number.prototype.clamp = function(min, max) { return Math.min(Math.max(this, min), max); }; 

(虽然扩展语言内置通常是皱眉了)

一个较less的“math”导向的方法,但也应该工作,这样,</>testing是暴露(也许比minimaxing更容易理解),但它确实取决于你的意思是“可读”

 function clamp(num, min, max) { return num <= min ? min : num >= max ? max : num; } 

更新ECMAScript 2017:

 Math.clamp(x, lower, upper) 

但请注意,截至今天,这是第一阶段的build议 。 在获得广泛支持之前,您可以使用polyfill 。

 Math.clip = function(number, min, max) { return Math.max(min, Math.min(number, max)); } 

在箭头性感的精神,你可以创build一个微型钳/限制/门/ C。 函数使用rest参数

 var clamp = (...v) => v.sort((a,b) => ab)[1]; 

然后传递三个值

 clamp(100,-3,someVar); 

也就是说,如果性感,你的意思是“短”

这不想成为一个“只用一个库”的答案,但万一你使用.clamp / Lodash你可以使用.clamp

 _.clamp(yourInput, lowerBound, upperBound); 

以便:

 _.clamp(22, -10, 10); // => 10 

这是它的执行,取自Lodash 来源 :

 /** * The base implementation of `_.clamp` which doesn't coerce arguments. * * @private * @param {number} number The number to clamp. * @param {number} [lower] The lower bound. * @param {number} upper The upper bound. * @returns {number} Returns the clamped number. */ function baseClamp(number, lower, upper) { if (number === number) { if (upper !== undefined) { number = number <= upper ? number : upper; } if (lower !== undefined) { number = number >= lower ? number : lower; } } return number; } 

另外,值得注意的是Lodash使得单独的模块可以作为独立的模块使用,所以如果你只需要这个方法,就可以在没有其他库的情况下安装它。

 npm i --save lodash.clamp 

如果您可以使用es6箭头function,也可以使用部分应用程序方法:

 const clamp = (min, max) => (value) => value < min ? min : value > max ? max : value; clamp(2, 9)(8); // 8 clamp(2, 9)(1); // 2 clamp(2, 9)(10); // 9 or const clamp2to9 = clamp(2, 9); clamp2to9(8); // 8 clamp2to9(1); // 2 clamp2to9(10); // 9 

您也可以使用这个可重复使用的数字钳位组件 ,它返回一个数值限制在给定范围内的数字。

例:

 clamp(50, 5, 10) // => 5 

怎么运行的:

 function clamp(value, min, max) { if (value < min) { return min; } if (value > max) { return max; } return value; } 

我的最爱:

 [min,x,max].sort()[1]