세그먼트에 숫자를 제한하는 가장 우아한 방법은 무엇입니까?
하자의 말 x, a그리고 숫자 b입니다. x세그먼트의 경계 를 제한해야합니다 [a, b].
글을 쓸 수 Math.max(a, Math.min(x, b))있습니다. 읽기가 쉽지 않다고 생각합니다. 누구든지 더 읽기 쉬운 방법으로 작성하는 영리한 방법이 있습니까?
당신이하는 방식은 꽤 표준입니다. 여기에clamp 설명 된대로 유틸리티 함수를 정의 할 수 있습니다 .
/**
* 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);
};
(확장 언어 내장은 일반적으로 눈살을 찌푸 리지만)
덜 "수학"지향적 인 접근 방식이지만 작동해야합니다. 이런 식으로 </> 테스트가 노출되어 (최소화보다 더 이해하기 쉬울 수 있음) 실제로 "읽기"라는 의미에 따라 늘어납니다.
function clamp(num, min, max) {
return num <= min ? min : num >= max ? max : num;
}
ECMAScript 2017 업데이트 :
Math.clamp(x, lower, upper)
하지만 오늘부터는 1 단계 제안 입니다. 폴리 필을 사용할 수 있습니다 .
Math.clip = function(number, min, max) {
return Math.max(min, Math.min(number, max));
}
이것은 "그냥 라이브러리 사용"답변이 아니지만하지만 Underscore / 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 화살표 기능을 사용할 수있는 경우 부분 애플리케이션 접근 방식을 사용할 수도 있습니다.
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
화살표 섹시 함의 정신으로 마이크로 시티 / 구속 / 게이트 / & c를 만들 수 있습니다. 다음 변수를 사용하는 기능
var clamp = (...v) => v.sort((a,b) => a-b)[1];
그런 다음 세 가지 값을 전달하십시오.
clamp(100,-3,someVar);
다시 말해서 섹시하다면 '짧다'라는 뜻입니다
함수를 정의하고 싶지 않다면 이렇게 작성하는 Math.min(Math.max(x, a), b)것은 나쁘지 않습니다.
내가 좋아하는 것:
[min,x,max].sort()[1]
참고 URL : https://stackoverflow.com/questions/11409895/whats-the-most-elegant-way-to-cap-a-number-to-a-segment
'IT' 카테고리의 다른 글
| 'for'루프 내부의 'for'루프가 동일한 카운터 변수 이름을 사용할 수 있습니까? (0) | 2020.08.13 |
|---|---|
| 어디에서 생성 날짜별로 정렬 된 디렉토리 목록을 어떻게 얻습니까? (0) | 2020.08.13 |
| 품질 성능없이 이미지 크기 조정 (0) | 2020.08.13 |
| Visual Studio 2015 프로젝트 빌드가 실패했지만 오류 없음 (0) | 2020.08.13 |
| 탭 문자를 얻는 방법? (0) | 2020.08.13 |