मेरे पास एक साधारण जावास्क्रिप्ट ऐरे ऑब्जेक्ट है जिसमें कुछ संख्याएँ हैं।
[267, 306, 108]
क्या कोई ऐसा फ़ंक्शन है जो इस सरणी में सबसे बड़ी संख्या पाएगा?
मेरे पास एक साधारण जावास्क्रिप्ट ऐरे ऑब्जेक्ट है जिसमें कुछ संख्याएँ हैं।
[267, 306, 108]
क्या कोई ऐसा फ़ंक्शन है जो इस सरणी में सबसे बड़ी संख्या पाएगा?
जवाबों:
Array.max = function( array ){
return Math.max.apply( Math, array );
};
चेतावनी : चूंकि कुछ वीएम पर तर्क की अधिकतम संख्या 65535 से कम है , इसलिए लूप के लिए उपयोग करें यदि आप निश्चित नहीं हैं कि सरणी छोटा है।
apply
कॉल की लागत बहुत आसानी से धो सकती है।
RangeError: Maximum call stack size exceeded.
आप Math.max पर कॉल करने के लिए, एप्लिकेशन फ़ंक्शन का उपयोग कर सकते हैं :
var array = [267, 306, 108];
var largest = Math.max.apply(Math, array); // 306
यह काम किस प्रकार करता है?
लागू समारोह एक सरणी के रूप में प्रदान किसी दिए गए संदर्भ और तर्क के साथ, एक और समारोह कॉल करने के लिए प्रयोग किया जाता है। न्यूनतम और अधिकतम फ़ंक्शंस में मनमानी संख्या में इनपुट तर्क हो सकते हैं: Math.max (val1, val2, ..., valN)
तो अगर हम कहते हैं:
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
ऊपर के लिए बनाया है
मैंने पाया है कि बड़े सरणियों (~ 100k तत्वों) के लिए, यह वास्तव में विनम्र for
पाश के साथ सरणी को पुनरावृत्त करने के लिए भुगतान करता है , ~ 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);
कैसे के बारे में Array.reduce का उपयोग कर ?
[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 पर फ़ायरफ़ॉक्स पर सबसे बड़ा साबित हुआ । इसका मतलब है कि अगर आप सरणी की तुलना में अधिक होता है 591,519 आइटम, 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/JavaScript/Reference/Global_Objects/Math/max
हां बिल्कुल मौजूद है: 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);
मैंने अभी JS से शुरुआत की थी लेकिन मुझे लगता है कि यह तरीका अच्छा होगा:
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)
के लिए या इससे बेहतर जोड़ने की आवश्यकता होगी , एक लूप फ़ंक्शन को बंद करने का उपयोग करें जैसे कि stackoverflow.com/a/54980012/7438857 में । इस संशोधन के साथ, यह एक अलग प्रश्न का बेहतर उत्तर देता है कि आप "एक बहुआयामी सरणी में सबसे बड़ी संख्या कैसे पाते हैं", या stackoverflow.com/questions/32616910/… पर । WIP: 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 से अधिक होने पर भी काम नहीं करता है। यह उत्तर भी देखें ।
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]);