আমি কীভাবে সহজেই কোনও জাভাস্ক্রিপ্ট অ্যারের ন্যূনতম বা সর্বোচ্চ উপাদানটি পেতে পারি?
উদাহরণসুডোকোড:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
Math.max.apply(null, [2,5,16,1])
আমি কীভাবে সহজেই কোনও জাভাস্ক্রিপ্ট অ্যারের ন্যূনতম বা সর্বোচ্চ উপাদানটি পেতে পারি?
উদাহরণসুডোকোড:
let array = [100, 0, 50]
array.min() //=> 0
array.max() //=> 100
Math.max.apply(null, [2,5,16,1])
উত্তর:
বিল্ট-ইন অ্যারে অবজেক্টটি ব্যবহার Math.max/ Math.minপরিবর্তে বাড়ানোর বিষয়ে :
Array.prototype.max = function() {
return Math.max.apply(null, this);
};
Array.prototype.min = function() {
return Math.min.apply(null, this);
};
এখানে একটি জেএসফিডাল ।
বিল্ট-ইনগুলিকে সংযোজন করা অন্যান্য লাইব্রেরির সাথে সংঘর্ষের কারণ হতে পারে (কিছু দেখুন), যাতে আপনি সরাসরি আপনার অ্যারেতে সরাসরি apply'প্রবেশ করানোতে আরও স্বাচ্ছন্দ্যবোধ করতে পারেন Math.xxx():
var min = Math.min.apply(null, arr),
max = Math.max.apply(null, arr);
পর্যায়ক্রমে, ধরে নিলে আপনার ব্রাউজারটি ECMAScript 6 সমর্থন করে, আপনি স্প্রেড অপারেটরটি ব্যবহার করতে পারেন যা applyপদ্ধতির অনুরূপ কাজ করে :
var min = Math.min( ...arr ),
max = Math.max( ...arr );
nullবা Mathবা {}যা কিছু apply()বা call()তার ফলাফলের কোনও ফল নেই। অভ্যন্তরীণভাবে Math.maxউল্লেখ করা উচিত নয় বা করা উচিত নয় this।
Math.max.apply(null, $.makeArray(array));
.maxবা .minপদ্ধতি সরবরাহ করে এমন সম্ভাবনার বিষয়েও । পুরোপুরি বাস্তবসম্মত দৃশ্য: আপনি এই উত্তরটি ব্যবহার করেন। 2016 সালে, ES7 বা ES8 টিপ Array.maxএবং Array.min। এই সংস্করণটির বিপরীতে, তারা স্ট্রিংগুলিতে কাজ করে। আপনার ভবিষ্যতের সহকর্মী এখন-ভালভাবে নথিভুক্ত নেটিভ .max()পদ্ধতিতে অ্যারেতে বর্ণমালা-সর্বশেষতম স্ট্রিংটি পাওয়ার চেষ্টা করে , তবে রহস্যজনকভাবে পান NaN। কয়েক ঘন্টা পরে, তিনি এই কোডটি খুঁজে পান, একটি চালান git blame, এবং আপনার নামটি অভিশাপ দেয়।
var max_of_array = Math.max.apply(Math, array);
সম্পূর্ণ আলোচনার জন্য দেখুন: http://aaroncrane.co.uk/2008/11/ জাভাস্ক্রিপ্ট_ম্যাক্স_পি /
Math.max.apply(Math, array)এবং Math.max.apply(null, array)? ব্লগটি বলে ... "... আপনাকেও পুনর্নির্বাচিতভাবে আবার বলতে হবে maxযা এর সাথে সম্পর্কিত Math...", তবে মনে হয় এটি করার দরকার নেই ( applyহিসাবে প্রথম যুক্তিটি সেট করে null)।
Math.max(a,b), Mathযেমন পাস করা হয়েছে thisমান, তাই এটি যখন সঙ্গে কলিং একই কাজ করতে জানার জন্য হতে পারে apply। তবে মানটি Math.maxব্যবহার করে না this, তাই আপনি যে মানটি চান তা পাস করতে পারেন।
বড় অ্যারেগুলির জন্য (~ 10⁷ উপাদান) Math.minএবং Math.maxউভয়ই নোড.জেএস-এ নিম্নলিখিত ত্রুটিটি উত্পন্ন করে produces
রেঞ্জেরর: সর্বোচ্চ কল স্ট্যাকের আকার অতিক্রম করেছে
আরও শক্তিশালী সমাধান হ'ল কল স্ট্যাকটিতে প্রতিটি উপাদান যুক্ত না করে পরিবর্তে একটি অ্যারে পাস করা:
function arrayMin(arr) {
return arr.reduce(function (p, v) {
return ( p < v ? p : v );
});
}
function arrayMax(arr) {
return arr.reduce(function (p, v) {
return ( p > v ? p : v );
});
}
আপনি যদি গতি সম্পর্কে উদ্বিগ্ন হন তবে নিম্নলিখিত কোডটি ~ 3 গুণ দ্রুত হয় তবে Math.max.applyআমার কম্পিউটারে। Http://jsperf.com/min-and-max-in-array/2 দেখুন ।
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (arr[len] < min) {
min = arr[len];
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (arr[len] > max) {
max = arr[len];
}
}
return max;
};
যদি আপনার অ্যারেতে সংখ্যার পরিবর্তে স্ট্রিং থাকে তবে আপনাকে এগুলিকে সংখ্যায় জোর করাও দরকার। নীচের কোডটি তা করে তবে এটি আমার মেশিনে কোডটি ~ 10 বার কমিয়ে দেয়। Http://jsperf.com/min-and-max-in-array/3 দেখুন ।
function arrayMin(arr) {
var len = arr.length, min = Infinity;
while (len--) {
if (Number(arr[len]) < min) {
min = Number(arr[len]);
}
}
return min;
};
function arrayMax(arr) {
var len = arr.length, max = -Infinity;
while (len--) {
if (Number(arr[len]) > max) {
max = Number(arr[len]);
}
}
return max;
};
minএবং maxশেষ উপাদানটিকে দিন এবং পুনরুক্তিগুলিকে 1 ( while(--len));) দ্বারা কমিয়ে দিন
very different results আপনি 5 বছর পরে এটা করেছে)
reduceসমাধানটি সবচেয়ে ধীর। এমনকি যদি আপনি এমন একটি অ্যারের সাথে কাজ করেন যার লক্ষ লক্ষ উপাদান রয়েছে তবে লুপের জন্য মানটি ব্যবহার করা আরও ভাল । আরও উত্তর জন্য আমার উত্তর দেখুন।
স্প্রেড অপারেটর (ES6) ব্যবহার করে
Math.max(...array); // the same with "min" => Math.min(...array);
If no arguments are given, the result is -∞.
// For regular arrays:
var max = Math.max(...arrayOfNumbers);
// For arrays with tens of thousands of items:
let max = testArray[0];
for (let i = 1; i < testArrayLength; ++i) {
if (testArray[i] > max) {
max = testArray[i];
}
}
অফিসিয়াল MDN ডক্সMath.max() ইতিমধ্যে এই সমস্যা জুড়ে:
একটি সংখ্যার অ্যারেতে সর্বাধিক উপাদান সন্ধান করতে নিম্নলিখিত ফাংশনটি Function.prototype.apply () ব্যবহার করে ।
getMaxOfArray([1, 2, 3])এর সমতুল্যMath.max(1, 2, 3), তবে আপনিgetMaxOfArray()কোনও আকারের প্রোগ্রাম্যাটিকভাবে নির্মিত অ্যারে ব্যবহার করতে পারেন ।function getMaxOfArray(numArray) { return Math.max.apply(null, numArray); }বা নতুন স্প্রেড অপারেটরের সাথে , একটি অ্যারের সর্বাধিক পাওয়া খুব সহজ হয়ে যায়।
var arr = [1, 2, 3]; var max = Math.max(...arr);
এমডিএন অনুসারেapply এবং বিস্তার সমাধান ছিল যে আর্গুমেন্ট সর্বোচ্চ সংখ্যক সীমা থেকে এসেছিলেন 65536 একটি সীমাবদ্ধতা:
তবে সাবধান থাকুন: এইভাবে প্রয়োগ করে আপনি জাভাস্ক্রিপ্ট ইঞ্জিনের যুক্তির দৈর্ঘ্য সীমা ছাড়িয়ে যাওয়ার ঝুঁকিটি চালান। অনেকগুলি আর্গুমেন্টের সাথে ফাংশন প্রয়োগের পরিণতিগুলি (কয়েক হাজার যুক্তির চেয়ে বেশি ভাবেন) ইঞ্জিনগুলিতে পৃথক হয়ে যায় ( জাভাস্ক্রিপ্টকোরের মধ্যে হার্ড-কোডেড যুক্তির সীমা 65536 রয়েছে ) কারণ সীমাটি (প্রকৃতপক্ষে কোনও অতিরিক্ত-বৃহত স্ট্যাকের প্রকৃতিও রয়েছে) আচরণ) অনির্দিষ্ট is কিছু ইঞ্জিন ব্যতিক্রম ছুঁড়ে ফেলবে। আরও ক্ষতিকারকভাবে, অন্যরা ইচ্ছাকৃতভাবে প্রয়োগিত ফাংশনে পাস হওয়া যুক্তির সংখ্যা সীমাবদ্ধ করবে। এই পরবর্তী ঘটনাটি উদাহরণস্বরূপ: যদি এইরকম ইঞ্জিনের চারটি আর্গুমেন্টের সীমা থাকে (প্রকৃত সীমা অবশ্যই উল্লেখযোগ্যভাবে উচ্চতর হয়) তবে এটি এমন হবে যেন উপরের উদাহরণগুলিতে প্রয়োগ করার জন্য 5, 6, 2, 3 টি আর্গুমেন্ট পাস হয়ে গেছে, বরং সম্পূর্ণ অ্যারের চেয়ে।
তারা এমনকি একটি সংকর সমাধান সরবরাহ করে যা অন্যান্য সমস্যার তুলনায় সত্যই ভাল পারফরম্যান্স দেয় না। আরও জন্য নীচে কর্মক্ষমতা পরীক্ষা দেখুন।
2019 সালে আসল সীমা কল স্ট্যাকের সর্বোচ্চ আকার । আধুনিক ক্রোমিয়াম ভিত্তিক ডেস্কটপ ব্রাউজারগুলির জন্য এর অর্থ হ'ল যখন এটি সর্বনিম্ন / সর্বাধিক applyবা সর্বাধিক সন্ধানের ক্ষেত্রে আসে তখন ব্যবহারিকভাবে কেবলমাত্র অ্যারেগুলির সর্বাধিক আকার হয় 120000 ডলার is । এর উপরে, একটি স্ট্যাক ওভারফ্লো হবে এবং নিম্নলিখিত ত্রুটি নিক্ষেপ করা হবে:
রেঞ্জেরর: সর্বোচ্চ কল স্ট্যাকের আকার অতিক্রম করেছে
নীচের স্ক্রিপ্ট সহ ( এই ব্লগ পোস্ট উপর ভিত্তি করে) ), ত্রুটিটি ধরা দিয়ে আপনি আপনার নির্দিষ্ট পরিবেশের সীমাটি গণনা করতে পারেন।
সতর্কবাণী! এই স্ক্রিপ্টটি চালাতে সময় লাগে এবং আপনার সিস্টেমের কার্যকারিতার উপর নির্ভর করে এটি আপনার ব্রাউজার / সিস্টেমকে ধীর করে দিতে পারে বা ক্রাশ হতে পারে!
let testArray = Array.from({length: 10000}, () => Math.floor(Math.random() * 2000000));
for (i = 10000; i < 1000000; ++i) {
testArray.push(Math.floor(Math.random() * 2000000));
try {
Math.max.apply(null, testArray);
} catch (e) {
console.log(i);
break;
}
}
এস্কেপনেটস্কেপের মন্তব্যে পরীক্ষার ভিত্তিতে আমি কয়েকটি মানদণ্ড তৈরি করেছি যা কেবলমাত্র 100000 আইটেমের সাথে একটি এলোমেলো সংখ্যায় 5 টি ভিন্ন পদ্ধতি পরীক্ষা করে ।
2019 সালে, ফলাফলগুলি দেখায় যে স্ট্যান্ডার্ড লুপ (যা বিটিডাব্লু এর আকার সীমাবদ্ধতা নেই) সর্বত্র দ্রুত। applyএবং স্প্রেডটি এর কাছাকাছি সময়ে আসে, তারপরে MDD এর হাইব্রিড দ্রবণটি তারপরে reduceসবচেয়ে ধীর হিসাবে হয়।
প্রায় সমস্ত পরীক্ষাগুলি একই ফলাফল দিয়েছে, যেখানে ছড়িয়ে পড়ে এমন কিছু বাদে যেখানে ধীরে ধীরে ধীরে ধীরে শেষ হয়েছিল।
যদি আপনি 1 মিলিয়ন আইটেম রাখার জন্য আপনার অ্যারে বাড়িয়ে তোলেন তবে জিনিসগুলি বিরতি পেতে শুরু করে এবং আপনি দ্রুত দ্রবণ reduceহিসাবে এবং ধীর হিসাবে মানক লুপটি রেখে যান ।
Math.max.apply(Math, arr)'সর্বোচ্চ' সামঞ্জস্যের জন্য সংকলিত হয় ।
(...)এবং applyহয় ব্যর্থ হয় বা ভুল ফলাফলটি ফিরে আসে যদি অ্যারেতে অনেক উপাদান থাকে [...] হ্রাস সমাধানে এই সমস্যা নেই" ক্রোম, এফএফ, এজ এবং আইআই 11 পরীক্ষা করে মনে হচ্ছে এটি এটি 100k মান পর্যন্ত অ্যারে জন্য ঠিক আছে। (উইন 10 এবং সর্বশেষ ব্রাউজারগুলিতে পরীক্ষিত: ক্রোম 110 কে, ফায়ারফক্স 300 ক, এজ 400 ক, আই 1111 ক)।
আপনি যদি আমার মতো অসম্পূর্ণ ব্যবহার Math.max.apply(যদি এমডিএন অনুসারে বড় অ্যারে দেওয়ার সময় ত্রুটির কারণ হতে পারে ) হয়ে থাকে তবে এটি ব্যবহার করে দেখুন:
function arrayMax(array) {
return array.reduce(function(a, b) {
return Math.max(a, b);
});
}
function arrayMin(array) {
return array.reduce(function(a, b) {
return Math.min(a, b);
});
}
অথবা, ES6 এ:
function arrayMax(array) {
return array.reduce((a, b) => Math.max(a, b));
}
function arrayMin(array) {
return array.reduce((a, b) => Math.min(a, b));
}
বেনামী ফাংশন দুর্ভাগ্যবশত প্রয়োজনীয় (পরিবর্তে ব্যবহার করছেন Math.max.bind(Math)কারণ reduceশুধু পাস না aএবং bতার ফাংশন, কিন্তু iএবং অ্যারে নিজেই একটি রেফারেন্স, তাই আমরা আমরা কল চেষ্টা করবেন না তা নিশ্চিত করার জন্য আছে maxভাল হিসাবে যারা করেন।
Math.max(...array)?
applyএবং তাই একই ডাউনসাইড রয়েছে (সর্বাধিক যুক্তির সীমা)।
function arrayMax(array) { return array.reduce(function(a, b) { return Math.max(a, b); }); // <--------- missing ) }
Math.min()কোনও মূল্যবোধ, রিটার্ন সহ কল করা নয় Infinity, যাতে এই ক্রিয়াকলাপগুলি reduce(..., Infinity)সেই আচরণের সাথে মেলে। যদিও আমি এটি ব্যতীত ছুঁড়ে ফেলা পছন্দ করি (যদিও এটি বর্তমানে রয়েছে) কারণ সর্বনিম্ন খালি অ্যারে নেওয়া ত্রুটি বলে মনে হচ্ছে।
.apply যখন অভিপ্রায়টি আর্গুমেন্ট মানগুলির তালিকা সহ একটি ভেরিয়াদিক ফাংশন চাওয়া হয় তখন প্রায়শই ব্যবহৃত হয়
Math.max([value1[,value2, ...]])ফাংশন শূন্য বা তার বেশি সংখ্যার বৃহত্তম ফেরৎ।
Math.max(10, 20); // 20
Math.max(-10, -20); // -10
Math.max(-10, 20); // 20
Math.max()পদ্ধতি একটি অ্যারের মধ্যে পাস করার অনুমতি দেয় না। আপনার যদি সবচেয়ে বড় হওয়া দরকার সেইগুলির একটি তালিকা আপনার কাছে থাকে তবে আপনি সাধারণত ফাংশন.প্রোটোটাইপ.অ্যাপ্লি () ব্যবহার করে এই ফাংশনটি কল করবেন eg
Math.max.apply(null, [10, 20]); // 20
Math.max.apply(null, [-10, -20]); // -10
Math.max.apply(null, [-10, 20]); // 20
তবে ECMAScript 6 হিসাবে আপনি স্প্রেড অপারেটরটি ব্যবহার করতে পারেন :
স্প্রেড অপারেটর এমন এক জায়গায় অভিব্যক্তি প্রসারিত করতে দেয় যেখানে একাধিক যুক্তি (ফাংশন কলগুলির জন্য) বা একাধিক উপাদান (অ্যারে আক্ষরিক জন্য) প্রত্যাশিত।
স্প্রেড অপারেটরটি ব্যবহার করে উপরেরগুলি আবার লিখতে পারেন:
Math.max(...[10, 20]); // 20
Math.max(...[-10, -20]); // -10
Math.max(...[-10, 20]); // 20
বৈকল্পিক অপারেটরটি ব্যবহার করে কোনও ফাংশন কল করার সময় আপনি অতিরিক্ত মানগুলিও যুক্ত করতে পারেন, যেমন eg
Math.max(...[10, 20], 50); // 50
Math.max(...[-10, -20], 50); // 50
বোনাস:
ছড়িয়ে অপারেটর একটি সমন্বয় ব্যবহার করে, আপনি অ্যারে আক্ষরিক সিনট্যাক্স ব্যবহার করতে পরিস্থিতিতে যেখানে ES5 আপনি অনুজ্ঞাসূচক কোড ফিরে আসবে করতে হবে নতুন অ্যারে তৈরি করতে সক্ষম push, spliceইত্যাদি
let foo = ['b', 'c'];
let bar = ['a', ...foo, 'd', 'e']; // ['a', 'b', 'c', 'd', 'e']
concatবেশিরভাগ প্রগ্রেমারদের দ্বারা ব্যবহার করে লেখা হবে কারণ এটি আপনাকে একটি একক লাইনের শৈলী বজায় রাখতে দেয়।
দুটি উপায় সংক্ষিপ্ত এবং সহজ:
let arr = [2, 6, 1, 0]
উপায় 1 :
let max = Math.max.apply(null, arr)
উপায় 2 :
let max = arr.reduce(function(a, b) {
return Math.max(a, b);
});
0ব্যবহার করতে পারেন (' [0].concat(arr)[0, ...arr]
একটির সর্বনিম্ন মান খুঁজে পাওয়ার সহজ সমাধান Arrayউপাদানগুলির হ'ল Arrayপ্রোটোটাইপ ফাংশনটি ব্যবহার করা reduce:
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min ? val : min, A[0]); // returns -9
বা জাভাস্ক্রিপ্টের অন্তর্নির্মিত ম্যাথ.মিন () ফাংশন (ধন্যবাদ @ টেনফ্লেক্স) ব্যবহার করে:
A.reduce((min,val) => Math.min(min,val), A[0]);
এটি সেট minকরে A[0]এবং তারপরে A[1]...A[n]এটি বর্তমানের চেয়ে কঠোরভাবে কম কিনা তা পরীক্ষা করে min। যদিA[i] < min তারপর minআপডেট করা হয়েছে A[i]। সমস্ত অ্যারে উপাদানগুলি প্রক্রিয়া minকরা হয়ে গেলে ফলাফল হিসাবে ফিরে আসে।
সম্পাদনা : সর্বনিম্ন মানের অবস্থান অন্তর্ভুক্ত করুন:
A = [4,3,-9,-2,2,1];
A.reduce((min, val) => val < min._min ? {_min: val, _idx: min._curr, _curr: min._curr + 1} : {_min: min._min, _idx: min._idx, _curr: min._curr + 1}, {_min: A[0], _idx: 0, _curr: 0}); // returns { _min: -9, _idx: 2, _curr: 6 }
minমূল্যটিই নয় তবে অ্যারেতে তার অবস্থান কীভাবে পাওয়া যায়?
অন্যরা ইতিমধ্যে কিছু সমাধান দিয়েছেন যাতে তারা বৃদ্ধি করে Array.prototype। এই উত্তরটি সকল আমি চাই নির্মল তা হওয়া উচিত Math.min.apply( Math, array )বা Math.min.apply( null, array )। সুতরাং কোন প্রসঙ্গে ব্যবহার করা উচিত, Mathবা null?
nullপ্রসঙ্গ হিসাবে পাস করার সময় apply, তারপরে প্রসঙ্গটি বিশ্বব্যাপী অবজেক্টে ( windowব্রাউজারের ক্ষেত্রে বস্তু) ডিফল্ট হয়ে যায় default Mathপ্রসঙ্গ হিসাবে বস্তুটি পাস করা সঠিক সমাধান হবে তবে এটি কোনওভাবেই পাস করতে ক্ষতি করবে না null। ফাংশনটি nullসজ্জিত করার সময় সমস্যা তৈরি হতে পারে এমন উদাহরণ এখানে রয়েছে Math.max:
// decorate Math.max
(function (oldMax) {
Math.max = function () {
this.foo(); // call Math.foo, or at least that's what we want
return oldMax.apply(this, arguments);
};
})(Math.max);
Math.foo = function () {
print("foo");
};
Array.prototype.max = function() {
return Math.max.apply(null, this); // <-- passing null as the context
};
var max = [1, 2, 3].max();
print(max);
কারণ উপরে একটি ব্যতিক্রম নিক্ষেপ করা হবে this.fooহিসাবে মূল্যায়ন করা হবে window.foo, যা, undefined। আমরা যদি প্রতিস্থাপন nullসঙ্গে Math, জিনিষ প্রত্যাশিত ও সুতো "foo বিন্যাস" পর্দায় প্রিন্ট করা হবে হিসেবে কাজ করবে (আমি এই ব্যবহার পরীক্ষিত মোজিলা গণ্ডার )।
আপনি অনুমান করতে পারেন যে কেউ এটি সজ্জিত করেনি Math.max, পাসিং nullসমস্যা ছাড়াই কাজ করবে।
Foo.staticMethodএবং রেফারেন্স করবে this? সজ্জাকারীর নকশায় সেটি কী ভুল হবে না? (অবশ্যই যদি না তারা বিশ্বব্যাপী ক্ষেত্রের রেফারেন্স দিতে চেয়েছিল , এবং জাভাস্ক্রিপ্ট ইঞ্জিনটি যেমন রাইনো ব্যবহৃত হচ্ছে তার থেকে আলাদা থাকতে চাই )।
Math.max, অনুমান অনুযায়ী প্রয়োগ, ব্যবহার করে না this। যদি কেউ Math.maxএটিকে ওভাররাইড করে যে এটি ব্যবহার করে this, তবে তারা তার আচরণটি অনুমানের লঙ্ঘন করেছে এবং আপনার উচিত তাদের তীক্ষ্ণ বস্তু নিক্ষেপ করা। আপনার সম্ভাব্যতার চেয়ে আপনার কোডিং করা উচিত নয় যে আপনি যে কেউ পরিবর্তিত হয়েছেন Math.maxএবং Math.minলুলদের পক্ষে সম্ভাবনা রয়েছে তার চারপাশে কোড করা উচিত ।
এটি করার আরও একটি উপায়:
var arrayMax = Function.prototype.apply.bind(Math.max, null);
ব্যবহার:
var max = arrayMax([2, 5, 1]);
এটি আপনার উদ্দেশ্য অনুসারে হতে পারে।
Array.prototype.min = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.min);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
Array.prototype.max = function(comparer) {
if (this.length === 0) return null;
if (this.length === 1) return this[0];
comparer = (comparer || Math.max);
var v = this[0];
for (var i = 1; i < this.length; i++) {
v = comparer(this[i], v);
}
return v;
}
comparerকিছু নির্দিষ্ট সুযোগ চালানোর কথা? কারণ এটি প্রতিটি সময়ে this[index]যা উল্লেখ রয়েছে undefinedtime
Math.xxx) বিশ্বব্যাপী সুযোগে
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Math/max
function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray);
}
var arr = [100, 0, 50];
console.log(getMaxOfArray(arr))
এটি আমার জন্য কাজ করেছে।
Math.minএবং Math.maxপদ্ধতি উভয় রিকার্সিভ অপারেশন জাতীয় ইঞ্জিন কল স্ট্যাক যোগ করা হচ্ছে যে, এবং সম্ভবত হয় ক্র্যাশ একটি অ্যারের যে আইটেমের বৃহৎ সংখ্যা উপস্থিত রয়েছে জন্য
(আরও ~ 10⁷ আইটেম চেয়ে, ব্যবহারকারীর ব্রাউজার উপর নির্ভর করে)।
Math.max (... এরে (1000000) .keys ());
আনকচড রেঞ্জেরর: সর্বোচ্চ কল স্ট্যাকের আকার ছাড়িয়ে গেছে
পরিবর্তে, এর মতো কিছু ব্যবহার করুন:
arr.reduce((max, val) => max > val ? max : val, arr[0])
বা আরও ভাল রান-টাইম সহ:
function maxValue(arr) {
let max = arr[0];
for (let val of arr) {
if (val > max) {
max = val;
}
}
return max;
}
বা ন্যূনতম এবং সর্বোচ্চ উভয়ই পেতে:
function getMinMax(arr) {
return arr.reduce(({min, max}, v) => ({
min: min < v ? min : v,
max: max > v ? max : v,
}), { min: arr[0], max: arr[0] });
}
বা আরও ভাল রান-টাইম * সহ:
function getMinMax(arr) {
let min = arr[0];
let max = arr[0];
let i = arr.length;
while (i--) {
min = arr[i] < min ? arr[i] : min;
max = arr[i] > max ? arr[i] : max;
}
return { min, max };
}
* ১,০০,০০০ আইটেমের সাথে পরীক্ষিত:
কেবলমাত্র একটি রেফারেন্সের জন্য, প্রথম ফাংশন রান-টাইম (আমার মেশিনে) ছিল 15.84ms বনাম 2 য় ফাংশন মাত্র 4.32 মিমি সহ।
আমি হ্রাস ফাংশন উল্লেখ না করে অবাক।
var arr = [1, 10, 5, 11, 2]
var b = arr.reduce(function(previous,current){
return previous > current ? previous:current
});
b => 11
arr => [1, 10, 5, 11, 2]
বড় অ্যারেগুলির জন্য (~ 10⁷ উপাদান), Math.minএবংMath.max নোড.জেজে একটি রেঞ্জেরিয়ার (সর্বাধিক কল স্ট্যাকের আকার ছাড়িয়েছে) সংগ্রহ করে।
বড় অ্যারেগুলির জন্য, একটি দ্রুত এবং মলিন সমাধানটি হ'ল:
Array.prototype.min = function() {
var r = this[0];
this.forEach(function(v,i,a){if (v<r) r=v;});
return r;
};
আমার একই সমস্যা ছিল, আমার একটি অ্যারের ন্যূনতম এবং সর্বাধিক মান অর্জন করা দরকার ছিল এবং আমার অবাক করে দিয়েছিল যে অ্যারেগুলির জন্য কোনও বিল্ট-ইন ফাংশন ছিল না। অনেকগুলি পড়ার পরে, আমি নিজেই "শীর্ষ 3" সমাধানগুলি পরীক্ষা করার সিদ্ধান্ত নিয়েছি:
পরীক্ষার কোডটি ছিল:
function GetMaxDISCRETE(A)
{ var MaxX=A[0];
for (var X=0;X<A.length;X++)
if (MaxX<A[X])
MaxX=A[X];
return MaxX;
}
function GetMaxAPPLY(A)
{ return Math.max.apply(null,A);
}
function GetMaxREDUCE(A)
{ return A.reduce(function(p,c)
{ return p>c?p:c;
});
}
অ্যারেটি 100,000 এলোমেলো পূর্ণসংখ্যার সংখ্যায় ভরা ছিল, প্রতিটি ফাংশন উইন্ডোজ ভিস্তার সাথে একটি ইন্টেল পেন্টিয়াম 4 2.99GHz ডেস্কটপে মোজিলা ফায়ারফক্স 28.0 এ 10,000 বার কার্যকর করা হয়েছিল। সময়গুলি সেকেন্ডে হয়, পারফরম্যান্স.নু () ফাংশন দ্বারা পুনরুদ্ধার করা হয়। 3 টি ভগ্নাংশ এবং মানক বিচ্যুতি সহ ফলাফলগুলি ছিল:
REDUCE দ্রবণটি পৃথক দ্রবণের চেয়ে 117% ধীর ছিল। অ্যাপ্লিকেশন সলিউশনটি পৃথক দ্রবণের চেয়ে 2,118% ধীরে ধীরে খারাপ ছিল। এছাড়াও, পিটার যেমন পর্যবেক্ষণ করেছেন, এটি বড় অ্যারে (প্রায় এক হাজারেরও বেশি উপাদান) এর জন্য কাজ করে না।
এছাড়াও, পরীক্ষাগুলি শেষ করতে, আমি এই বর্ধিত বিযুক্ত কোডটি পরীক্ষা করেছি:
var MaxX=A[0],MinX=A[0];
for (var X=0;X<A.length;X++)
{ if (MaxX<A[X])
MaxX=A[X];
if (MinX>A[X])
MinX=A[X];
}
সময়সীমা: গড় = 0.218, এসডি = 0.094
সুতরাং, এটি সহজ বিচ্ছিন্ন সমাধানের তুলনায় 35% ধীর, তবে এটি একবারে সর্বাধিক এবং সর্বনিম্ন উভয় মান পুনরুদ্ধার করে (অন্য কোনও সমাধান এগুলি পুনরুদ্ধার করতে কমপক্ষে দ্বিগুণ সময় নেয়)। ও.পি. উভয় মান প্রয়োজন হলে, পৃথক সমাধান সেরা পছন্দ (এমনকি দুটি পৃথক ফাংশন হিসাবে, একটি সর্বাধিক গণনা করার জন্য এবং অন্যটি ন্যূনতম গণনা করার জন্য, তারা দ্বিতীয় সেরা, রেডইউসিইউ সমাধানকে ছাড়িয়ে যাবে)।
আপনি আপনার প্রকল্পের যে কোনও জায়গায় নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:
function getMin(array){
return Math.min.apply(Math,array);
}
function getMax(array){
return Math.max.apply(Math,array);
}
এবং তারপরে আপনি অ্যারে পাস করে ফাংশনগুলি কল করতে পারেন:
var myArray = [1,2,3,4,5,6,7];
var maximo = getMax(myArray); //return the highest number
নিম্নলিখিত কোডটি আমার পক্ষে কাজ করে:
var valueList = [10,4,17,9,3];
var maxValue = valueList.reduce(function(a, b) { return Math.max(a, b); });
var minValue = valueList.reduce(function(a, b) { return Math.min(a, b); });
আপনি যেতে হিসাবে ট্র্যাক রাখা, মাধ্যমে ইট্রেটেট।
var min = null;
var max = null;
for (var i = 0, len = arr.length; i < len; ++i)
{
var elem = arr[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
alert( "min = " + min + ", max = " + max );
অ্যারেতে কোনও উপাদান না থাকলে এটি সর্বনিম্ন / সর্বোচ্চ নাল ছাড়বে। অ্যারেতে কোনও উপাদান থাকলে একটি পাসে ন্যূনতম এবং সর্বাধিক সেট করবে।
আপনি rangeপুনরায় ব্যবহারের সুযোগ এবং পড়ার যোগ্যতার উন্নতি করতে উপরেরটি ব্যবহার করে অ্যারে বাড়িয়ে দিতে পারেন । Http://jsfiddle.net/9C9fU/ এ একটি কার্যকারী ফিডল দেখুন
Array.prototype.range = function() {
var min = null,
max = null,
i, len;
for (i = 0, len = this.length; i < len; ++i)
{
var elem = this[i];
if (min === null || min > elem) min = elem;
if (max === null || max < elem) max = elem;
}
return { min: min, max: max }
};
হিসাবে ব্যবহার
var arr = [3, 9, 22, -7, 44, 18, 7, 9, 15];
var range = arr.range();
console.log(range.min);
console.log(range.max);
rangeফাংশনে প্রসারিত করা তুচ্ছ হবে যা একই সাথে আইএমও-তে সর্বনিম্ন এবং সর্বোচ্চ উভয়ই পেতে পারে - যেহেতু আমি আমার উত্তরের আপডেট দিয়েছি।
আমি ভেবেছিলাম আমি আমার সহজ এবং সহজ বোঝার সমাধানটি ভাগ করব।
মিনিটের জন্য:
var arr = [3, 4, 12, 1, 0, 5];
var min = arr[0];
for (var k = 1; k < arr.length; k++) {
if (arr[k] < min) {
min = arr[k];
}
}
console.log("Min is: " + min);
এবং সর্বোচ্চ জন্য:
var arr = [3, 4, 12, 1, 0, 5];
var max = arr[0];
for (var k = 1; k < arr.length; k++) {
if (arr[k] > max) {
max = arr[k];
}
}
console.log("Max is: " + max);
গণিত ফাংশন সর্বাধিক এবং মিনিট ব্যবহারের পাশাপাশি, অন্য একটি ফাংশনটি হ'ল সাজানো () এর বিল্ট ইন ফাংশন: আমরা এখানে যাই go
const nums = [12, 67, 58, 30].sort((x, y) =>
x - y)
let max = nums[0]
let min = nums[nums.length -1]
অবজেক্টের অ্যারে থেকে সর্বাধিক মান পাওয়ার একটি উপায় এখানে। একটি অনুলিপি তৈরি করুন (স্লাইস সহ), তারপরে অনুলিপি ক্রমে সাজানো এবং প্রথম আইটেমটি ধরুন।
var myArray = [
{"ID": 1, "Cost": 200},
{"ID": 2, "Cost": 1000},
{"ID": 3, "Cost": 50},
{"ID": 4, "Cost": 500}
]
maxsort = myArray.slice(0).sort(function(a, b) { return b.ID - a.ID })[0].ID;
ব্যবহার Math.max()বাMath.min()
Math.max(10, 20); // 20
Math.min(-10, -20); // -20
নিম্নলিখিত ফাংশনটি Function.prototype.apply()একটি সংখ্যাসূচক অ্যারে সর্বাধিক উপাদান সন্ধান করতে ব্যবহার করে। getMaxOfArray([1, 2, 3])এর সমতুল্য Math.max(1, 2, 3), তবে আপনি getMaxOfArray()কোনও আকারের প্রোগ্রাম্যাটিকভাবে নির্মিত অ্যারে ব্যবহার করতে পারেন ।
function getMaxOfArray(numArray) {
return Math.max.apply(null, numArray);
}
বা নতুন স্প্রেড অপারেটরের সাথে, একটি অ্যারের সর্বাধিক পাওয়া খুব সহজ হয়ে যায়।
var arr = [1, 2, 3];
var max = Math.max(...arr); // 3
var min = Math.min(...arr); // 1
যদি আপনি প্রোটোপ ব্যবহার করেন তবে কেওসপ্যান্ডিয়নের সমাধান কাজ করে। যদি তা না হয় তবে এটি বিবেচনা করুন:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
Array.min = function( array ){
return Math.min.apply( Math, array );
};
উপরে অ্যারে মানটি পূর্ণসংখ্যা হিসাবে না এনএন প্রদান করবে সুতরাং এটি এড়াতে আপনার কিছু কার্যকারিতা তৈরি করা উচিত। অন্যথায় এটি কাজ করবে।
Mathবিষয়টিকে প্রসঙ্গ হিসাবে ব্যবহার না করে আপনার সমাধানটি কীভাবে আলাদা ?
আপনি লাইব্রেরি সুগার.জেএস ব্যবহার করলে , আপনি যেমন পরামর্শ দিচ্ছেন তেমনভাবে arr.min () এবং arr.max () লিখতে পারেন । আপনি অ-সংখ্যাযুক্ত অ্যারে থেকেও সর্বনিম্ন এবং সর্বাধিক মান পেতে পারেন।
মিনিট (মানচিত্র, সমস্ত = মিথ্যা) সর্বনিম্ন মান সহ অ্যারেতে উপাদান ফেরত দেয়। মানচিত্রটি চেক করার জন্য মানটি ম্যাপিং বা শর্টকাট হিসাবে অভিনয় করা একটি স্ট্রিং হতে পারে। যদি সমস্ত সত্য হয় তবে একটি অ্যারেতে সমস্ত ন্যূনতম মানগুলি ফিরিয়ে দেবে।
সর্বাধিক মান (মানচিত্র, সমস্ত = মিথ্যা) অ্যারের মধ্যে উপাদানটি সর্বাধিক মান দিয়ে দেয়। মানচিত্রটি চেক করার জন্য মানটি ম্যাপিং বা শর্টকাট হিসাবে অভিনয় করা একটি স্ট্রিং হতে পারে। যদি সমস্ত সত্য হয় তবে অ্যারেতে সমস্ত সর্বাধিক মান ফিরে আসবে।
উদাহরণ:
[1,2,3].min() == 1
['fee','fo','fum'].min('length') == "fo"
['fee','fo','fum'].min('length', true) == ["fo"]
['fee','fo','fum'].min(function(n) { return n.length; }); == "fo"
[{a:3,a:2}].min(function(n) { return n['a']; }) == {"a":2}
['fee','fo','fum'].max('length', true) == ["fee","fum"]
লো-ড্যাশ এবং আন্ডারস্কোর.জে এর মতো গ্রন্থাগারগুলিও অনুরূপ শক্তিশালী মিনি এবং সর্বাধিক ক্রিয়াকলাপ সরবরাহ করে:
লো-ড্যাশ থেকে উদাহরণ:
_.max([4, 2, 8, 6]) == 8
var characters = [
{ 'name': 'barney', 'age': 36 },
{ 'name': 'fred', 'age': 40 }
];
_.max(characters, function(chr) { return chr.age; }) == { 'name': 'fred', 'age': 40 }
চেষ্টা
let max= a=> a.reduce((m,x)=> m>x ? m:x);
let min= a=> a.reduce((m,x)=> m<x ? m:x);
ম্যাথ.মিনি / সর্বোচ্চ (+ প্রয়োগ) এর জন্য আমরা ত্রুটি পাই:
সর্বাধিক কল স্ট্যাকের আকার ছাড়িয়ে গেছে (Chrome 74.0.3729.131)
...সহ)Math.max()ভালো:Math.max(...[2, 5, 16, 1])। আমার উত্তর এমডিএন ডকুমেন্টেশন থেকে তৈরি দেখুন ।