किसी सरणी में सबसे बड़ी मान का रिटर्न इंडेक्स


139

मेरे पास यह है:

var arr = [0, 21, 22, 7];

किसी अन्य चर में उच्चतम मूल्य के सूचकांक को वापस करने का सबसे अच्छा तरीका क्या है?


21
यह डुप्लिकेट नहीं है, प्रश्न पढ़ें… @ डन्क्रम्ब एसओ जिस तरह से काम करता है वह यह है कि मैं इस प्रश्न को पोस्ट कर रहा हूं और आने वाले दशकों तक लोग इसे ढूंढेंगे, इसे पढ़ेंगे, और इस जानकारी के लिए आभारी होंगे कि नीचे पोस्ट किए गए योगदानकर्ता हैं!
स्टीफन

1
@ स्टेपेन, इसके विपरीत, यदि आप इस FAQ को पढ़ते हैं, तो आप उस व्यक्तिपरक प्रश्नों (जैसे कि जो "सबसे अच्छा तरीका है ..." शुरू करते हैं) को स्पष्ट रूप से हतोत्साहित करते देखेंगे। हालाँकि, SO एक समुदाय है, इसलिए समुदाय को यह निर्धारित करना है कि यह प्रश्न बंद होना चाहिए या नहीं।
१६:०६ में डनक्रम्ब जूल

6
किसी सरणी में सबसे बड़ी संख्या का पता लगाना एक सरणी में सबसे बड़ी संख्या के सूचकांक को खोजने के समान नहीं है। इसलिए यह प्रश्न डुप्लिकेट के रूप में पोस्ट किए गए उस संदर्भ का डुप्लिकेट नहीं है।
Fzs2

15
यह डुप्लिकेट नहीं है - या कम से कम संदर्भित प्रश्न का नहीं है। मैं इस पर पड़ने वाले दबाव को नहीं समझ सकता - यह कहते हुए कि आप SO पर कुछ करने का सबसे अच्छा तरीका नहीं पूछ सकते हैं, और इस तरह के संक्षिप्त प्रश्न के लिए कोई कोड उदाहरण की आवश्यकता नहीं है। यह कैसे है कि संदर्भित 'डुप्लिकेट' में +30 वोट हैं, और इस समानांतर BUT DIFFERENT सवाल, एक ही समान शैली में पूछा गया, जिसमें -3 ​​वोट हैं? कृपया प्रश्न को दोबारा पढ़ें और अपने चिन्हित-डुप्लिकेट वोटों को हटा दें। "का सूचकांक" वह महत्वपूर्ण वाक्यांश है जिसे आपको प्रश्न शीर्षक में स्थान देना है।
पैनकेक

@Dancrumb stackoverflow.com/help/dont-ask में मौजूदा सलाह केवल व्यक्तिपरक प्रश्नों को हतोत्साहित करती है अगर हर उत्तर समान रूप से मान्य हो। इस मामले में, "सर्वश्रेष्ठ" का मूल्यांकन प्रदर्शन, मरोड़ और अभिव्यक्ति के संदर्भ में स्पष्ट रूप से किया जा सकता है।
user234461

जवाबों:


165

यह शायद सबसे अच्छा तरीका है, क्योंकि यह विश्वसनीय है और पुराने ब्राउज़रों पर काम करता है:

function indexOfMax(arr) {
    if (arr.length === 0) {
        return -1;
    }

    var max = arr[0];
    var maxIndex = 0;

    for (var i = 1; i < arr.length; i++) {
        if (arr[i] > max) {
            maxIndex = i;
            max = arr[i];
        }
    }

    return maxIndex;
}

यह भी एक लाइनर है:

let i = arr.indexOf(Math.max(...arr));

यह आवश्यक के रूप में दो बार तुलना करता है और RangeErrorबड़े सरणियों पर फेंक देगा , हालांकि। मैं फ़ंक्शन के लिए छड़ी हूँ।


1
ठीक है, यह फ़ंक्शन सबसे बड़े मूल्य के लिए पहला सामना किया गया सूचकांक लौटाता है । मान लें कि मेरे पास एक ही उच्चतम मान वाला एक से अधिक सूचकांक हैं, मुझे ये सभी सूचकांक कैसे प्राप्त होंगे ?
ed1nh0

1
@ ed1nh0: कई पास बनाने का आसान तरीका है। अधिकतम के साथ खोजें const max = arr.reduce((m, n) => Math.max(m, n)), फिर अधिकतम के अनुक्रमित हैं [...arr.keys()].filter(i => arr[i] === max)
Ry-

[...arr.keys()]एक त्रुटि उत्पन्न करता है:unexpected token
ed1nh0

@ ed1nh0: आप किस ब्राउज़र / वातावरण को लक्षित कर रहे हैं?
Ry-

क्रोम। मैं VueJS का उपयोग कर रहा हूं और मुझे लगता है कि समस्या वेबपैक कॉन्फ़िगरेशन पर कुछ है।
ed1nh0

82

एक पंक्ति में और शायद तब तेज arr.indexOf(Math.max.apply(Math, arr)):

var a = [0, 21, 22, 7];
var indexOfMaxValue = a.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);

document.write("indexOfMaxValue = " + indexOfMaxValue); // prints "indexOfMaxValue = 2"

कहाँ पे:

  • iMax- अब तक का सबसे अच्छा सूचकांक (पहले तत्व पर अब तक का अधिकतम तत्व का सूचकांक, iMax = 0क्योंकि दूसरा तर्क reduce()है 0, हम reduce()अपने मामले में दूसरे तर्क को छोड़ नहीं सकते )
  • x - वर्तमान में सरणी से परीक्षण किया गया तत्व
  • i - वर्तमान में परीक्षण किया गया सूचकांक
  • arr- हमारी सरणी ( [0, 21, 22, 7])

reduce()विधि के बारे में (डेविड फ्लैगन द्वारा "जावास्क्रिप्ट: द डेफिनिटिव गाइड" से):

कम () दो तर्क लेता है। पहला फ़ंक्शन है जो कमी ऑपरेशन करता है। इस कमी फ़ंक्शन का कार्य किसी भी मूल्य में दो मानों को संयोजित करना या कम करना है, और उस कम किए गए मान को वापस करना है।

कम () के साथ उपयोग किए जाने वाले कार्य forEach () और मानचित्र () के साथ उपयोग किए जाने वाले फ़ंक्शन से भिन्न होते हैं। परिचित मूल्य, सूचकांक और सरणी मान दूसरे, तीसरे और चौथे तर्क के रूप में पारित किए जाते हैं। पहला तर्क है अब तक की कटौती का संचित परिणाम। फ़ंक्शन के पहले कॉल पर, यह पहला तर्क प्रारंभिक मूल्य है जिसे आपने कम करने के लिए दूसरे तर्क के रूप में पारित किया है ()। बाद की कॉल पर, यह फ़ंक्शन के पिछले आह्वान द्वारा लौटाया गया मान है।

जब आप कोई प्रारंभिक मान नहीं घटाते () लागू करते हैं, तो यह प्रारंभिक मान के रूप में सरणी के पहले तत्व का उपयोग करता है। इसका मतलब यह है कि कमी फ़ंक्शन के लिए पहली कॉल में पहले और दूसरे तर्क के रूप में पहले और दूसरे सरणी तत्व होंगे।


12
@traxium जब आपकी व्याख्या महान है, तो उदाहरण उन कार्यात्मक प्रोग्रामिंग में कम के लिए स्पष्ट हो सकता है यदि हमने अधिक वर्णनात्मक चर का उपयोग किया है। कहो: arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);जिसे निम्न के रूप में वर्णित किया जा सकता है: 0 (2 पैरामीटर) से शुरू होने वाले सरणी को पुनरावृत्त करें, यदि वर्तमान में TestedValue , BestIndexSoFar पर मौजूद तत्व के मान से अधिक है , तो फिर वर्तमान में जमा किए गए IndexSoFar के रूप में अगले पुनरावृत्ति पर लौटें
niieani

1
@traxium बहुत बढ़िया जवाब। मैं @niii के साथ भी सहमत हूं यहां एक वास्तविक विश्व उदाहरण है जिसे मैंने लागू किया है this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0):।
डेनियल

2
@DanielK, "पूर्ण" पैरामीटर नाम के साथ उत्तर एक स्टैकओवरफ़्लो लाइन में फिट नहीं होगा। एक क्षैतिज स्क्रॉल बार दिखाई देगा और क्षैतिज स्क्रॉल करते समय स्निपेट को पढ़ना बहुत सुविधाजनक नहीं होगा। वैसे भी सुझाव के लिए धन्यवाद। मैंने दूसरे तरीके से उत्तर को संपादित किया।
ट्रेक्सियम

@ एफटीएक्स 1 एफपी समाधान के लिए। जबकि जेएस के साथ शुरू होने वाले किसी व्यक्ति के लिए इसका रुग्ण रूप जटिल है, ओपी की समस्या को हल करने के लिए आपका समाधान भी सबसे अच्छा प्रदर्शन करने वालों में से एक होता है।
SeaWarrior404

Jsben.ch/ujXlk के अनुसार , दूसरी विधि तेज़ है।
VFDan

47

यहाँ एक और उपाय है, यदि आप स्प्रेड ऑपरेटर का उपयोग करके ES6 का उपयोग कर रहे हैं:

var arr = [0, 21, 22, 7];

const indexOfMaxValue = arr.indexOf(Math.max(...arr));

6

जब तक मैं गलत नहीं हूँ, मैं कहूँगा कि यह आपका अपना कार्य लिखना है।

function findIndexOfGreatest(array) {
  var greatest;
  var indexOfGreatest;
  for (var i = 0; i < array.length; i++) {
    if (!greatest || array[i] > greatest) {
      greatest = array[i];
      indexOfGreatest = i;
    }
  }
  return indexOfGreatest;
}

6

यदि आप अंडरस्कोर का उपयोग कर रहे हैं, तो आप इस अच्छे शॉर्ट वन-लाइनर का उपयोग कर सकते हैं:

_.indexOf(arr, _.max(arr))

यह पहली बार सरणी के सबसे बड़े आइटम का मान प्राप्त करेगा, इस मामले में 22। तब वह इस मामले के सूचकांक को वापस कर देगा जहां 22 सरणी के भीतर है, इस मामले में 2।


6

अधिकतम उपयोग का दूसरा उपाय reduce:

[1,2,5,0,4].reduce((a,b,i) => a[0] < b ? [b,i] : a, [Number.MIN_VALUE,-1])
//[5,2]

[5e-324, -1]सरणी खाली है, तो यह देता है। यदि आप सिर्फ इंडेक्स चाहते हैं, तो [1]बाद में डालें ।

के माध्यम से न्यूनतम (बदलें >और MAX_VALUE):

[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]

1

संपादित करें: वर्षों पहले मैंने इस पर एक उत्तर दिया था जो सकल, बहुत विशिष्ट और बहुत जटिल था। इसलिए मैं इसका संपादन कर रहा हूं। मैं उनके स्वच्छ कारक के लिए ऊपर दिए गए कार्यात्मक उत्तरों का पक्ष लेता हूं लेकिन उनकी पठनीयता का नहीं; लेकिन अगर मैं जावास्क्रिप्ट से अधिक परिचित था, तो मैं उनके लिए भी पसंद कर सकता हूं।

छद्म कोड:

ट्रैक इंडेक्स जिसमें सबसे बड़ा मूल्य होता है। मान लें कि इंडेक्स 0 शुरू में सबसे बड़ा है। वर्तमान सूचकांक के खिलाफ तुलना करें। यदि आवश्यक हो तो सबसे बड़े मूल्य के साथ अद्यतन सूचकांक।

कोड:

var mountains = [3, 1, 5, 9, 4];

function largestIndex(array){
  var counter = 1;
  var max = 0;

  for(counter; counter < array.length; counter++){
    if(array[max] < array[counter]){
        max = counter;
    }
  }
  return max;
}

console.log("index with largest value is: " +largestIndex(mountains));
// index with largest value is: 3

धन्यवाद! मुझे इसके साथ और गड़बड़ करनी पड़ी।
रॉस स्टूडेंट

1
function findIndicesOf(haystack, needle)
{
    var indices = [];

    var j = 0;
    for (var i = 0; i < haystack.length; ++i) {
        if (haystack[i] == needle)
            indices[j++] = i;
    }
    return indices;
}

पारित arrayकरने के लिए haystackऔर Math.max(...array)करने के लिए needle। यह सरणी के सभी अधिकतम तत्व देगा , और यह अधिक एक्स्टेंसिबल है (उदाहरण के लिए, आपको न्यूनतम मान भी खोजना होगा)


1

यदि आप सरणी की एक प्रति बनाते हैं और इसे अवरोही क्रमबद्ध करते हैं, तो प्रतिलिपि का पहला तत्व सबसे बड़ा होगा। मूल सरणी में आप इसके सूचकांक को पा सकते हैं।

var sorted = [...arr].sort((a,b) => b - a)
arr.indexOf(sorted[0])

कॉपी के लिए समय जटिलता O (n) है, O और (n *) सॉर्टिंग के लिए O और (n) indexOf के लिए।

यदि आपको इसे तेज़ी से करने की आवश्यकता है, तो Ry का उत्तर O (n) है।


0

 var arr=[0,6,7,7,7];
 var largest=[0];
 //find the largest num;
 for(var i=0;i<arr.length;i++){
   var comp=(arr[i]-largest[0])>0;
      if(comp){
	  largest =[];
	  largest.push(arr[i]);
	  }
 }
 alert(largest )//7
 
 //find the index of 'arr'
 var arrIndex=[];
 for(var i=0;i<arr.length;i++){
    var comp=arr[i]-largest[0]==0;
	if(comp){
	arrIndex.push(i);
	}
 }
 alert(arrIndex);//[2,3,4]


-1

इस फ़ंक्शन का एक स्थिर संस्करण इस तरह दिखता है:

// not defined for empty array
function max_index(elements) {
    var i = 1;
    var mi = 0;
    while (i < elements.length) {
        if (!(elements[i] < elements[mi]))
            mi = i;
        i += 1;
    }
    return mi;
}

इस संदर्भ में "स्थिर" का क्या अर्थ है?
Ry-

मुझे लगता है कि वह "उपयुक्त" का मतलब था
इकबेल

-5

सरल

maxarr: function(){
let maxval = 0;
let maxindex = null;
for (i = 0; i < arr.length; i++){
if (arr[i] > maxval) {
maxval = arr[i];
maxindex = i;
}
}
}

क्षमा करें, मैंने पोस्ट को स्पष्ट रूप से नहीं पढ़ा है अब मैं कोड
vidhyesh

कृपया अपने उत्तर को थोड़ा और स्पष्ट करें (चढ़ाव को हटाने में मदद करता है) और इसे अन्य उत्तर से अलग करने का भी प्रयास करें (यानी: कम संसाधनों का उपयोग करना या गणना में तेज होना ... आदि)। (लो-क्वालिटी आंसर रिव्यू की समाप्ति)।
ZF007

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