मुझे जावास्क्रिप्ट सरणी में निहित सबसे बड़ी संख्या कैसे मिल सकती है?


206

मेरे पास एक साधारण जावास्क्रिप्ट ऐरे ऑब्जेक्ट है जिसमें कुछ संख्याएँ हैं।

[267, 306, 108]

क्या कोई ऐसा फ़ंक्शन है जो इस सरणी में सबसे बड़ी संख्या पाएगा?


22
Math.max(...[267, 306, 108]);
जैक्सनक्रे

जवाबों:


315

बचाव के लिए:

Array.max = function( array ){
    return Math.max.apply( Math, array );
};

चेतावनी : चूंकि कुछ वीएम पर तर्क की अधिकतम संख्या 65535 से कम है , इसलिए लूप के लिए उपयोग करें यदि आप निश्चित नहीं हैं कि सरणी छोटा है।


15
आह, लेकिन अब यह गुणवत्ता का एसओ स्टिकर है जो इसे थोड़े थोड़े टेढ़े-मेढ़े अंदाज में पेश करता है!
शोग

2
एफडब्ल्यूआईडब्ल्यू, अगर प्रदर्शन आपके समाधान का एक कारक है, तो मैं यह सुनिश्चित करने के लिए अपने स्वयं के आसानी से कोडित फ़ंक्शन की तुलना में परीक्षण करूंगा कि यह अच्छा प्रदर्शन करता है। हम मानते हैं कि मूल कार्यान्वयन तेजी से होगा; वास्तव में, applyकॉल की लागत बहुत आसानी से धो सकती है।
टीजे क्राउडर

2
क्या होगा यदि मेरी सरणी लंबाई पैरामीटर गणना सीमा से बड़ी है?
lukas.pukenis

3
@CrescentFresh इसके अनुसार: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… इसे 65535 पर हार्डकोड किया जाता है। इसके अनुसार: code.google.com/p/v8-issues/detail?id = 172 और ज्ञान से कि तर्क ढेर पर धकेल दिए जाते हैं, हम जानते हैं कि यह असीमित नहीं है
lukas.pukenis

9
इसके अलावा, यह विधि मजबूत नहीं है। यह विफल रहता है अगर आपका सरणी mamximum स्टैक आकार से बड़ा हैRangeError: Maximum call stack size exceeded.
मार्क

197

आप 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);

ध्यान दें कि पहला पैरामीटर, संदर्भ, इन कार्यों के लिए महत्वपूर्ण नहीं है क्योंकि वे स्थिर हैं, वे संदर्भ के रूप में पारित होने की परवाह किए बिना काम करेंगे।


2
आप अपने जवाबों को बहुत प्रयास के साथ
डालते हैं

1
एक दम बढ़िया। लेकिन क्या होगा यदि मेरी सरणी लंबाई पैरामीटर आकार सीमा (फ़ंक्शन की) से अधिक है? फिर क्या ?
lukas.pukenis

1
मुझे यह उत्तर दूसरों की तुलना में बेहतर लगता है क्योंकि यह बताता है कि सब कुछ क्या और क्यों करता है। +1
मार्विन

59

नए प्रसार ऑपरेटर के साथ सबसे आसान वाक्यविन्यास :

var arr = [1, 2, 3];
var max = Math.max(...arr);

स्रोत: मोज़िला एमडीएन


2
हालांकि, दोनों फैल गए (...) और लागू होने पर या तो विफल हो जाएगा या गलत परिणाम लौटाएगा यदि सरणी में बहुत सारे तत्व हैं डेवलपर। pmillailla.org/en-US/docs/Web/JavaScript/Reference/…
ग्रीन

@Green FWIW, पैरामीटर गणना की सीमा 65536 (कम से कम क्रोम पर है) ([स्रोत ( bugs.webkit.org/show_bug.cgi?id=80797)] )। इसलिए यदि आपके सरणी में 65536 से अधिक तत्व हैं, तो यह उत्तर काम नहीं करेगा।
mgthomas99

4
65536 किसी के लिए पर्याप्त होना चाहिए
vsync

41

मैं कोई जेएस विशेषज्ञ नहीं हूं, लेकिन मैं देखना चाहता था कि ये तरीके कैसे ढेर हो जाते हैं, इसलिए यह मेरे लिए अच्छा अभ्यास था। मुझे नहीं पता कि यह तकनीकी रूप से इनका परीक्षण करने का सही तरीका है, लेकिन मैंने उन्हें एक के बाद एक सही तरीके से चलाया, जैसा कि आप मेरे कोड में देख सकते हैं।

सॉर्ट करना और 0 वां मान प्राप्त करना सबसे खराब विधि है (और यह आपके सरणी के क्रम को संशोधित करता है, जो वांछनीय नहीं हो सकता है)। जब तक आप लाखों सूचकांकों की बात नहीं कर रहे हैं, तब तक यह अंतर नगण्य है।

यादृच्छिक संख्याओं के 100,000-सूचकांक सरणी के साथ पांच रन के औसत परिणाम:

  • कम करने के लिए चलाने के लिए 4.0392ms लिया
  • Math.max.apply ले लिया 3.3742ms को चलाने के लिए
  • सॉर्टिंग और 0 मूल्य प्राप्त करने के लिए चलाने के लिए 67.4724ms लिया
  • कम करने के लिए Math.max () चलाने के लिए 6.5804ms लिया
  • कस्टम फाइंडमैक्स फ़ंक्शन को चलाने के लिए 1.6102ms लगे

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)

7
मेरे लिए, इस सवाल का सबसे अच्छा जवाब है।
रेज़लेक

1
मैंने jsperf testsऊपर के लिए बनाया है
vsync

37

मैंने पाया है कि बड़े सरणियों (~ 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;
}

बेंचमार्क परिणाम


3
FWIW, क्रोम 31 पर अब 84% पर आता है।
इलान बिआला

31

आप सरणी को अवरोही क्रम में सॉर्ट कर सकते हैं और पहला आइटम प्राप्त कर सकते हैं:

[267, 306, 108].sort(function(a,b){return b-a;})[0]

4
मुझे लगता है कि तुम भी बस तरह और अंतिम आइटम मिल सकता है ...?
शोघ

@ Shog9: हाँ, लेकिन आपको अपने दम पर तुलनात्मक कार्य निर्दिष्ट करना होगा:sort(function(a,b){return b-a;})
Gumbo

9
आह। मैं और अधिक सोच रहा था:[...].sort().pop()
Shog9

4
"नंबर ढूंढना ऑर्डर-एन लेता है, क्रमबद्धता (एन लॉग एन) से ऑर्डर (एन
स्क्वार्ड

2
यह भी ध्यान रखें कि यह सरणी को सॉर्ट करता है, जो एक वांछित दुष्प्रभाव हो सकता है या नहीं। लागू समाधान बेहतर प्रदर्शन कर रहा है और इसका कोई दुष्प्रभाव नहीं है।
कालेब

28

इस बारे में कैसा है:

var arr = [1,2,3,4];

var largest = arr.reduce(function(x,y){
       return (x > y) ? x : y;
});

console.log(largest);

अगर मुझे यह उत्तर पहले (वर्तमान में सूची में सबसे नीचे) दिखाई देता तो मुझे दो घंटे बचते।
user139301

1
Math.max दृष्टिकोण शायद सबसे मानक है, लेकिन जब सरणी बहुत बड़ी (500K) थी तो मुझे एक स्टैक ओवरफ्लो हो रहा था। यह उत्तर तेज और कुशल है और वह है जिसे मैंने खुद का उपयोग करके समाप्त किया है, इसलिए मैं इसे बढ़ा रहा हूं।
जय

8

कैसे के बारे में Array.reduce का उपयोग कर ?

[0,1,2,3,4].reduce(function(previousValue, currentValue){
  return Math.max(previousValue,currentValue);
});

प्रारंभिक मान सेट किया जाना चाहिए -Infinity
जेक

@ जेक, इसकी आवश्यकता क्यों है? यहां तक ​​कि सभी नकारात्मक संख्याओं की एक सरणी के साथ, मुझे एक वैध परिणाम मिलता है।
कोडटूड

1
यह किनारे का मामला है जिससे एरे खाली है।
Ja --ck

5

लगभग सभी उत्तर उपयोग करते हैं 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];
}

मैंने इस प्रश्न के बारे में अपने ब्लॉग पर यहाँ लिखा है


1
यह ठीक नहीं है। मुझे उत्तर यहीं चाहिए, एसओ पर, दूसरे तीसरे पक्ष के संसाधन के लिए लिंक नहीं। विशेष रूप से जब यह "यहाँ सब कुछ बुरा है, के साथ संयुक्त है, लेकिन देखो, यह मेरे ब्लॉग पर बहुत अच्छा है ..."
ओसा

@SergeyOrshanskiy किसी नए पक्षकार और समाधान के साथ अपडेट होने की स्थिति में किसी तृतीय पक्ष के लिए एक लिंक बहुत अच्छी तरह से काम करता है। इसके अलावा नाराज महसूस करने की कोई जरूरत नहीं है। लोग सिर्फ आपकी समस्याओं को हल करना चाहते हैं। मैं इसे भी हल करना चाहता था, इसलिए मैंने अपने ब्लॉग पर इसके बारे में लिखा
lukas.pukenis

5

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);


2
हालांकि, दोनों फैल गए (...) और लागू होने पर या तो विफल हो जाएगा या गलत परिणाम लौटाएगा यदि सरणी में बहुत सारे तत्व हैं डेवलपर.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
ग्रीन

5

अधिकतम और न्यूनतम मूल्य खोजना आसान और मैन्युअल तरीका है। इस कोड की तुलना में बहुत तेज है 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()खाली सरणी के लिए गलत परिणाम देता है।
जेक

4

सरणी में सबसे बड़ी संख्या को खोजने के लिए जिसे आपको उपयोग करने की आवश्यकता है 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


3

हां बिल्कुल मौजूद है: Math.max.apply(null,[23,45,67,-45]) और परिणाम वापसी 67;



1

मत भूलो कि लपेटो के साथ किया जा सकता है Function.prototype.bind, आपको "ऑल-देशी" फ़ंक्शन दे सकता है ।

var aMax = Math.max.apply.bind(Math.max, Math);
aMax([1, 2, 3, 4, 5]); // 5

1

आप Arrayइस फ़ंक्शन का विस्तार कर सकते हैं और इसे हर ऐरे का हिस्सा बना सकते हैं।

Array.prototype.max = function(){return Math.max.apply( Math, this )};
myArray = [1,2,3];

console.log( myArray.max() );

1
बेहद अक्षम है।
फ्रैंक श्मिट

@FrankSchmitt, धन्यवाद, मैं सहमत हूं। मूल उत्तर एक अच्छा समाधान नहीं था। डिफ़ॉल्ट रूप से क्रमबद्ध संख्याओं को क्रमबद्ध नहीं करता है, यह तत्वों को तार के रूप में मानता है। मेरे उत्तर को सही प्रकार से संपादित करें।
इज्ज़

वह मेरी बात नहीं थी। अधिकतम को खोजने के लिए एक ऐरे को छाँटना प्रति से अधिक अयोग्य है, क्योंकि इसमें कम से कम एन लॉग एन ऑपरेशन लगते हैं, जबकि अधिकतम को एन ऑपरेशन में किया जा सकता है।
फ्रैंक श्मिट



1

आप यह कोशिश कर सकते हैं,

var arr = [267,306,108];
var largestNum = 0;
for(i=0;i<arr.length;i++) {
   if(arr[i]>largest){
    var largest = arr[i];
   }
}
console.log(largest);

1

मैंने अभी 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केवल नकारात्मक संख्याएं हों।
तीपेमम्म

0

एक बहुआयामी सरणी में सबसे बड़ी संख्या का पता लगाएं

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;

यह हमेशा अपने कोड में कुछ विस्तृत विवरण जोड़ने के लिए सलाह दी जाती है, खासकर अगर पहले से ही कई अन्य उत्तर हैं। यह एक अलग / बेहतर क्यों है?
बोदज़ोन

@ Bowdzone, टिप्पणी के लिए धन्यवाद। यह तरीका बहुत ही बुनियादी है जो थोड़े से तरीकों के थोड़े से ज्ञान के साथ समझने में सरल बनाता है।
Liveindream

यह सबसे बड़ी संख्या वापस नहीं करता है, यह बहुआयामी सरणी में प्रत्येक सरणी की सबसे बड़ी संख्या का एक सरणी देता है। आपको उदाहरण var tmax = Math.max.apply(Math, max)के लिए या इससे बेहतर जोड़ने की आवश्यकता होगी , एक लूप फ़ंक्शन को बंद करने का उपयोग करें जैसे कि stackoverflow.com/a/54980012/7438857 में । इस संशोधन के साथ, यह एक अलग प्रश्न का बेहतर उत्तर देता है कि आप "एक बहुआयामी सरणी में सबसे बड़ी संख्या कैसे पाते हैं", या stackoverflow.com/questions/32616910/… पर । WIP: jsfiddle.net/jamesray/3cLu9for/8
जेम्स रे

stackoverflow.com/a/32617019/7438857 सही प्रश्न का एक बेहतर उत्तर है, जबकि यह उत्तर उपरोक्त प्रश्न का उत्तर नहीं देता है, यह एक बहुआयामी सरणी के भीतर प्रत्येक सरणी में सबसे बड़ी संख्या देता है।
जेम्स रे

0

इसे चलाओ:

Array.prototype.max = function(){
    return Math.max.apply( Math, this );
};

और अब [3,10,2].max()रिटर्न की कोशिश करो10


0

बबल सॉर्ट का उपयोग करके अधिकतम और न्यूनतम मान प्राप्त करें

    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]);


1
(1) जावास्क्रिप्ट सरणियों में पहले से ही एक ओ (एन लॉग एन) सॉर्ट फ़ंक्शन है। (2) बबल सॉर्ट O (n ^ 2) है। (3) न्यूनतम और अधिकतम ढूँढना O (n) है।
तीपेमम्म

0

इसे इस्तेमाल करे

function largestNum(arr) {
  var currentLongest = arr[0]

  for (var i=0; i< arr.length; i++){
    if (arr[i] > currentLongest){
      currentLongest = arr[i]
    }
  }

  return currentLongest
}

1
क्या यह उत्तर इस पृष्ठ पर मौजूद अन्य लोगों से काफी हद तक अलग है?
टेपेइमम

0

@ क्वासिमोंडो की टिप्पणी के अनुसार , जो काफी हद तक याद किया गया है, नीचे दिखाया गया है कि जैसा कि यहां दिखाया गया है: 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;
}

0

टर्नरी ऑपरेटरों का उपयोग करके इसे कैसे किया जाए, इस पर एक पुनरावर्ती दृष्टिकोण

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);


0

एक 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);

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.