চল বলি x
, a
এবং b
সংখ্যা হয়। x
সেগমেন্টের সীমানায় আমার ক্যাপ করা দরকার [a, b]
।
আমি লিখতে পারি Math.max(a, Math.min(x, b))
, তবে আমি এটি পড়তে খুব সহজ মনে করি না। এটিকে আরও পঠনযোগ্য উপায়ে লেখার জন্য কারও কি চতুর উপায় আছে?
চল বলি 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);
};
(যদিও অন্তর্নির্মিত ভাষার প্রসারকে সাধারণত অস্বীকার করা হয়)
Math.min
এবং Math.max
দীর্ঘ এর প্যারামিটার হিসাবে হিসাবে অপ্রাসঙ্গিক Math.min
হয় max
এবং প্যারামিটার Math.max
হয় min
।
Number.prototype
এই ক্ষেত্রে) বিভিন্ন কারণে অসুস্থ পরামর্শ দেওয়া হয়। "খারাপ অনুশীলন: ডেভেলপার প্রোটোটাইপগুলির সম্প্রসারণ" বিকাশকারী.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েবে / জাভা স্ক্রিপ্ট / এ দেখুন
কম "গণিত" ভিত্তিক দৃষ্টিভঙ্গি, তবে এটিও কাজ করা উচিত, এইভাবে </> পরীক্ষা উন্মুক্ত করা হয়েছে (মিনিমেক্সিংয়ের চেয়ে আরও বেশি বোধগম্য) তবে এটি "পাঠযোগ্য" দ্বারা আপনি কী বোঝাতে চেয়েছেন তা নির্ভর করে
function clamp(num, min, max) {
return num <= min ? min : num >= max ? max : num;
}
Math.random()
কল থেকে ওভারহেডটি সরিয়ে থাকেন তবে এই সাধারণ পদ্ধতিরটি 10 এক্স দ্রুত ।
ECMAScript 2017 এর জন্য আপডেট:
Math.clamp(x, lower, upper)
তবে মনে রাখবেন যে আজকের হিসাবে এটি একটি স্টেজ 1 প্রস্তাব । যতক্ষণ না এটি ব্যাপকভাবে সমর্থিত হয়, আপনি পলিফিল ব্যবহার করতে পারেন ।
Math.clip = function(number, min, max) {
return Math.max(min, Math.min(number, max));
}
prototype
যখন ফাংশনটি ব্যবহার করতে চাই তখন আমি খুব মার্জিতটিকে প্রসারিত করার বিষয়টি বিবেচনা করি ।
এটি "সবেমাত্র ব্যবহারের জন্য একটি লাইব্রেরি" উত্তর হতে চাইছে না তবে আপনি যদি লোড্যাশ ব্যবহার করছেন তবে আপনি এটি ব্যবহার করতে পারেন .clamp
:
_.clamp(yourInput, lowerBound, upperBound);
যাতে:
_.clamp(22, -10, 10); // => 10
লোডাশ উত্স থেকে নেওয়া এর বাস্তবায়ন এখানে দেওয়া হল :
/**
* 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;
}
এছাড়াও, এটি লক্ষণীয় যে লোদাশ একক পদ্ধতি একক মডিউল হিসাবে উপলব্ধ করে তোলে, সুতরাং আপনার যদি কেবল এই পদ্ধতির প্রয়োজন হয় তবে আপনি বাকী লাইব্রেরি ছাড়া এটি ইনস্টল করতে পারেন:
npm i --save lodash.clamp
আপনি যদি এস arrow টি তীর ফাংশন ব্যবহার করতে সক্ষম হন তবে আপনি আংশিক অ্যাপ্লিকেশন পদ্ধতিরও ব্যবহার করতে পারেন:
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
তীর যৌনতার চেতনায় আপনি একটি মাইক্রো বাতা / সীমাবদ্ধতা / গেট / & সি তৈরি করতে পারেন। বিশ্রাম পরামিতি ব্যবহার করে ফাংশন
var clamp = (...v) => v.sort((a,b) => a-b)[1];
তারপরে তিনটি মান পাস করুন
clamp(100,-3,someVar);
এটি আবার, যদি সেক্সি দ্বারা, আপনার অর্থ 'শর্ট'
clamp
, আপনার জটিল যুক্তি (এমনকি এটি "সেক্সি" হলেও) পারফ একটি মারাত্মক আঘাত হানবে
এটি যদি / অন্যটি যা মাইন করা হয় ত্রৈমাসিক বিকল্পের সমতুল্য হয় তবে পঠনযোগ্যতার ত্যাগ না করে তবে এটি তিনটি বিকল্পকে প্রসারিত করে।
const clamp = (value, min, max) => {
if (value < min) return min;
if (value > max) return max;
return value;
}
Minifies 35b (বা 43 বি ব্যবহার করে function
):
const clamp=(c,a,l)=>c<a?a:c>l?l:c;
এছাড়াও, আপনি কি পারফ টুলিং বা ব্রাউজার ব্যবহার করেন তার উপর নির্ভর করে আপনি গণিত ভিত্তিক প্রয়োগ বা ত্রৈমাসিক ভিত্তিক প্রয়োগ দ্রুততর কিনা তা বিভিন্ন ফলাফল পান। মোটামুটি একই পারফরম্যান্সের ক্ষেত্রে, আমি পঠনযোগ্যতা বেছে নেব।
আমার পছন্দ:
[min,x,max].sort()[1]
[1,5,19].sort()[1]
19 এ ফিরে আসে It এটি ঠিক করা যেতে পারে: [min,x,max].sort(function(a, b) { return a - b; })[1]
তবে এটি আর সেক্সি নয়। পাশাপাশি যখন ভারী ব্যবহার করা হয় তখন কেবল তিনটি সংখ্যার তুলনা করার জন্য একটি নতুন অ্যারে তৈরি করা একটি পারফরম্যান্সের সমস্যা হতে পারে।
[min, x, max].sort((a,b) => a-b)[1]