আমার একটি সাধারণ জাভাস্ক্রিপ্ট অ্যারে অবজেক্ট রয়েছে যাতে কয়েকটি সংখ্যা রয়েছে।
[267, 306, 108]
এমন কোন ফাংশন রয়েছে যা এই অ্যারেতে সর্বাধিক সংখ্যাটি খুঁজে পাবে?
আমার একটি সাধারণ জাভাস্ক্রিপ্ট অ্যারে অবজেক্ট রয়েছে যাতে কয়েকটি সংখ্যা রয়েছে।
[267, 306, 108]
এমন কোন ফাংশন রয়েছে যা এই অ্যারেতে সর্বাধিক সংখ্যাটি খুঁজে পাবে?
উত্তর:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
সতর্কতা : যেহেতু কিছু ভিএমগুলিতে সর্বাধিক সংখ্যক যুক্তি সংখ্যা 65535 এর চেয়ে কম , সুতরাং ল্যাপের জন্য একটি ব্যবহার করুন যদি আপনি নিশ্চিত না হন যে অ্যারেটি খুব ছোট।
apply
কলটির দাম খুব সহজেই তা ধুয়ে ফেলতে পারে।
RangeError: Maximum call stack size exceeded.
ম্যাথ.ম্যাক্স কল করতে আপনি প্রয়োগ ফাংশনটি ব্যবহার করতে পারেন :
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
কিভাবে এটা কাজ করে?
প্রয়োগ করা ফাংশন একটি অ্যারে হিসাবে প্রদান করা একটি প্রদত্ত প্রসঙ্গ এবং আর্গুমেন্ট, সঙ্গে, অন্য ফাংশন কল করতে ব্যবহৃত হয়। সর্বনিম্ন এবং সর্বোচ্চ ফাংশনগুলি ইনপুট আর্গুমেন্টের একটি স্বেচ্ছাসেবী সংখ্যার নিতে পারে: ম্যাথ.ম্যাক্স (ভাল 1, ভাল 2, ..., ভালএন)
সুতরাং আমরা যদি কল:
Math.min.apply(Math, [1,2,3,4]);
প্রয়োগ ফাংশন কার্যকর হবে:
Math.min(1,2,3,4);
মনে রাখবেন যে প্রথম প্যারামিটার, প্রসঙ্গটি এই ফাংশনগুলির জন্য গুরুত্বপূর্ণ নয় যেহেতু তারা অচল, তারা প্রসঙ্গ হিসাবে যা পাস তা নির্বিশেষে তারা কাজ করবে।
নতুন স্প্রেড অপারেটরের সাথে সবচেয়ে সহজ বাক্য গঠন :
var arr = [1, 2, 3];
var max = Math.max(...arr);
সূত্র: মজিলা এমডিএন
আমি কোনও জেএস বিশেষজ্ঞ নই, তবে আমি দেখতে চেয়েছিলাম যে এই পদ্ধতিগুলি কীভাবে সজ্জিত হয়, তাই এটি আমার পক্ষে ভাল অনুশীলন ছিল। আমি জানি না যে এটি প্রযুক্তিগতভাবে এগুলি পারফরম্যান্স টেস্টের সঠিক উপায় কিনা তবে আপনি আমার কোডটিতে দেখতে পাচ্ছেন, তবে আমি কেবল তাদের একের পর এক চালাচ্ছি।
0 ম মান বাছাই করা এবং পাওয়া এখন পর্যন্ত সবচেয়ে খারাপ পদ্ধতি (এবং এটি আপনার অ্যারের ক্রমটি পরিবর্তন করে, এটি পছন্দসই নয়)। অন্যদের জন্য, আপনি লক্ষ লক্ষ সূচকের কথা না বলে পার্থক্যটি নগণ্য।
এলোমেলো সংখ্যার 100,000-সূচকের অ্যারে সহ পাঁচটি রানের গড় ফলাফল:
var performance = window.performance
function findmax(array)
{
var max = 0,
a = array.length,
counter
for (counter=0;counter<a;counter++)
{
if (array[counter] > max)
{
max = array[counter]
}
}
return max
}
function findBiggestNumber(num) {
var counts = []
var i
for (i = 0; i < num; i++) {
counts.push(Math.random())
}
var a, b
a = performance.now()
var biggest = counts.reduce(function(highest, count){
return highest > count ? highest : count
}, 0)
b = performance.now()
console.log('reduce took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest2 = Math.max.apply(Math, counts)
b = performance.now()
console.log('Math.max.apply took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest3 = counts.sort(function(a,b){return b-a;})[0]
b = performance.now()
console.log('sorting and getting the 0th value took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest4 = counts.reduce(function(highest, count){
return Math.max(highest,count)
}, 0)
b = performance.now()
console.log('Math.max within reduce() took ' + (b - a) + ' ms to run')
a = performance.now()
var biggest5 = findmax(counts)
b = performance.now()
console.log('custom findmax function took ' + (b - a) + ' ms to run')
console.log(biggest + '-' + biggest2 + '-' + biggest3 + '-' + biggest4 + '-' + biggest5)
}
findBiggestNumber(1E5)
jsperf tests
আমি দেখতে পেয়েছি যে বড় অ্যারেগুলির জন্য (k 100k উপাদান), এটি কেবলমাত্র বিনীত for
লুপের সাহায্যে অ্যারেটি পুনরাবৃত্তি করে than 30% এর চেয়ে আরও ভাল পারফর্ম করে Math.max.apply()
:
function mymax(a)
{
var m = -Infinity, i = 0, n = a.length;
for (; i != n; ++i) {
if (a[i] > m) {
m = a[i];
}
}
return m;
}
আপনি অ্যারেটিকে অবতরণ ক্রমে বাছাই করতে এবং প্রথম আইটেমটি পেতে পারেন:
[267, 306, 108].sort(function(a,b){return b-a;})[0]
sort(function(a,b){return b-a;})
[...].sort().pop()
এটি সম্পর্কে:
var arr = [1,2,3,4];
var largest = arr.reduce(function(x,y){
return (x > y) ? x : y;
});
console.log(largest);
অ্যারে.রেডুস কীভাবে ব্যবহার করবেন ?
[0,1,2,3,4].reduce(function(previousValue, currentValue){
return Math.max(previousValue,currentValue);
});
-Infinity
।
উত্তরগুলির প্রায় Math.max.apply()
সবগুলিই ব্যবহার করে যা সুন্দর এবং জঘন্য, তবে এর সীমাবদ্ধতা রয়েছে।
ফাংশন আর্গুমেন্টগুলি স্ট্যাকের উপরে স্থাপন করা হয় যার একটি ডাউনসাইড রয়েছে - একটি সীমা। সুতরাং আপনার অ্যারে যদি সীমা চেয়ে বড় হয় তবে এটি ব্যর্থ হবেRangeError: Maximum call stack size exceeded.
একটি কল স্ট্যাকের আকার খুঁজতে আমি এই কোডটি ব্যবহার করেছি:
var ar = [];
for (var i = 1; i < 100*99999; i++) {
ar.push(1);
try {
var max = Math.max.apply(Math, ar);
} catch(e) {
console.log('Limit reached: '+i+' error is: '+e);
break;
}
}
এটি আমার মেশিনে ফায়ারফক্সে সবচেয়ে বড় প্রমাণিত হয়েছে - 591519 । এর অর্থ এই যে, আপনি যদি অ্যারে চেয়ে বেশি অক্ষর 591519 আইটেম, Math.max.apply()
পরিণাম ডেকে আনবে RangeError ।
এই সমস্যার সর্বোত্তম সমাধানটি পুনরাবৃত্ত উপায় (ক্রেডিট: https://developer.mozilla.org/ ):
max = -Infinity, min = +Infinity;
for (var i = 0; i < numbers.length; i++) {
if (numbers[i] > max)
max = numbers[i];
if (numbers[i] < min)
min = numbers[i];
}
আমি আমার ব্লগে এই প্রশ্নের সম্পর্কে লিখিত আছে এখানে ।
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/max
const inputArray = [ 1, 3, 4, 9, 16, 2, 20, 18];
const maxNumber = Math.max(...inputArray);
console.log(maxNumber);
সর্বাধিক এবং ন্যূনতম সহজ এবং ম্যানুয়াল উপায়ের সন্ধান করা। এই কোডটি এর চেয়ে অনেক দ্রুত Math.max.apply
; আমি অ্যারেতে 1000k সংখ্যা পর্যন্ত চেষ্টা করেছি।
function findmax(array)
{
var max = 0;
var a = array.length;
for (counter=0;counter<a;counter++)
{
if (array[counter] > max)
{
max = array[counter];
}
}
return max;
}
function findmin(array)
{
var min = array[0];
var a = array.length;
for (counter=0;counter<a;counter++)
{
if (array[counter] < min)
{
min = array[counter];
}
}
return min;
}
findmax()
অ্যারেতে কেবল নেতিবাচক সংখ্যা থাকলে ভুল ফলাফল দেয়; findmin()
একটি খালি অ্যারে জন্য ভুল ফলাফল দেয়।
একটি অ্যারেতে সর্বাধিক সংখ্যাটি খুঁজে পেতে আপনার কেবল ব্যবহার করতে হবে Math.max(...arrayName);
, এটি এর মতো কাজ করে:
let myArr = [1, 2, 3, 4, 5, 6];
console.log(Math.max(...myArr));
এ সম্পর্কে আরও জানতে Math.max
: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / ম্যাথ /
ম্যাক্স
হ্যাঁ অবশ্যই বিদ্যমান: Math.max.apply(null,[23,45,67,-45])
এবং ফলাফল ফিরে 67
;
সাধারণ একটি লাইনার
[].sort().pop()
আপনি Array
এই ফাংশনটি বাড়িয়ে দিতে এবং এটিকে প্রতিটি অ্যারের অংশ করতে পারেন।
Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];
console.log( myArray.max() );
এছাড়াও আপনি ব্যবহার করতে পারেন foreach :
var maximum = Number.MIN_SAFE_INTEGER;
var array = [-3, -2, 217, 9, -8, 46];
array.forEach(function(value){
if(value > maximum) {
maximum = value;
}
});
console.log(maximum); // 217
ব্যবহার - Array.prototype.reduce()
দুর্দান্ত!
[267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val)
যেখানে acc = সঞ্চালক এবং ভাল = বর্তমান মান ;
var a = [267, 306, 108].reduce((acc,val)=> (acc>val)?acc:val);
console.log(a);
আমি কেবল জেএস দিয়ে শুরু করেছি তবে আমি মনে করি এই পদ্ধতিটি ভাল হবে:
var array = [34, 23, 57, 983, 198];<br>
var score = 0;
for(var i = 0; i = array.length; i++) {
if(array[ i ] > score) {
score = array[i];
}
}
array
কেবলমাত্র নেতিবাচক সংখ্যা থাকে তবে এতে সমস্যা হবে ।
var max = [];
for(var i=0; arr.length>i; i++ ){
var arra = arr[i];
var largest = Math.max.apply(Math, arra);
max.push(largest);
}
return max;
var tmax = Math.max.apply(Math, max)
, বা আরও ভাল যোগ করতে হবে , একটি লুপ ফাংশন যেমন একটি স্ট্যাকওভারফ্লো . com /a/ 54980012/7438857 এ একটি ক্লোজার ব্যবহার করুন । এই পরিবর্তনের মাধ্যমে, এটি একটি পৃথক প্রশ্নের উত্তরের উত্তর দেওয়া হয়, কীভাবে আপনি "বহুমাত্রিক অ্যারেতে সর্বাধিক সংখ্যা খুঁজে পাবেন", বা স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 32616910/… এ পাবেন । ডাব্লুআইপি: jsfiddle.net/jamesray/3cLu9for/8 ।
বুদ্বুদ বাছাই করে সর্বাধিক এবং ন্যূনতম মান সন্ধান করুন
var arr = [267, 306, 108];
for(i=0, k=0; i<arr.length; i++) {
for(j=0; j<i; j++) {
if(arr[i]>arr[j]) {
k = arr[i];
arr[i] = arr[j];
arr[j] = k;
}
}
}
console.log('largest Number: '+ arr[0]);
console.log('Smallest Number: '+ arr[arr.length-1]);
@ কাসিমন্ডোর মন্তব্য অনুসারে , যা বেশিরভাগই মিস হয়েছে বলে মনে হচ্ছে, নীচে এখানে প্রদর্শিত হিসাবে সেরা পারফরম্যান্স রয়েছে বলে মনে হচ্ছে: https://jsperf.com/finding-maximum-element-in-an-array । মনে রাখবেন যে প্রশ্নের অ্যারে থাকাকালীন, পারফরম্যান্সের উল্লেখযোগ্য প্রভাব নাও পড়তে পারে, কারণ বড় অ্যারের কার্য সম্পাদন আরও গুরুত্বপূর্ণ হয়ে ওঠে এবং আবার যেমন উল্লেখ করা হয়েছে Math.max()
যে অ্যারের দৈর্ঘ্য 65535 এর বেশি হলে এমনকি ব্যবহার করে না work এই উত্তরটি দেখুন ।
function largestNum(arr) {
var d = data;
var m = d[d.length - 1];
for (var i = d.length - 1; --i > -1;) {
if (d[i] > m) m = d[i];
}
return m;
}
টের্নারি অপারেটরগুলি ব্যবহার করে এটি কীভাবে করা যায় সে সম্পর্কে একটি পুনরাবৃত্ত দৃষ্টিভঙ্গি
const findMax = (arr, max, i) => arr.length === i ? max :
findMax(arr, arr[i] > max ? arr[i] : max, ++i)
const arr = [5, 34, 2, 1, 6, 7, 9, 3];
const max = findMax(arr, arr[0], 0)
console.log(max);
একটি for/of
লুপ সমাধান:
const numbers = [2, 4, 6, 8, 80, 56, 10];
const findMax = (...numbers) => {
let currentMax = numbers[0]; // 2
for (const number of numbers) {
if (number > currentMax) {
console.log(number, currentMax);
currentMax = number;
}
}
console.log('Largest ', currentMax);
return currentMax;
};
findMax(...numbers);
Math.max(...[267, 306, 108]);