IT

세그먼트에 숫자를 제한하는 가장 우아한 방법은 무엇입니까?

lottoking 2020. 8. 13. 06:52
반응형

세그먼트에 숫자를 제한하는 가장 우아한 방법은 무엇입니까?


하자의 말 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

반응형