একটি অ্যারের মধ্যে সর্বাধিক মানের সূচক ফেরত


138

আমার আছে এটা:

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

সর্বাধিক মানের সূচকটিকে অন্য ভেরিয়েবলে ফেরানোর সর্বোত্তম উপায় কী?


21
এটি কোনও সদৃশ নয়, প্রশ্নটি পড়ুন ... @ ড্যানক্রাম্ব এসও যেভাবে কাজ করে তা হল আমি এই প্রশ্নটি পোস্ট করি এবং আগামী কয়েক দশক ধরে লোকেরা এটি খুঁজে পাবে, এটি পড়বে, এবং নীচে অবদানকারীদের পোস্ট করা তথ্যের জন্য কৃতজ্ঞ!
স্টিফেন

1
@ স্টেফেন, বিপরীতে, আপনি যদি এই এফএকিউ পড়েন তবে আপনি দেখতে পাবেন যে বিষয়গত প্রশ্নগুলি (যেমন "সবচেয়ে ভাল উপায় কী ..." শুরু হয়) তা স্পষ্টভাবে নিরুৎসাহিত হয়। তবে এসও একটি সম্প্রদায়, সুতরাং এই প্রশ্নটি বন্ধ করা উচিত কিনা তা সম্প্রদায়ের পক্ষে নির্ধারণ করা।
ড্যানক্রাম্ব

6
একটি অ্যারের বৃহত্তম সংখ্যা সন্ধান করা একটি অ্যারের বৃহত্তম সংখ্যার সূচক সন্ধান করার মতো নয়। সুতরাং এই প্রশ্নটি সদৃশ হিসাবে পোস্ট করা রেফারেন্সের সদৃশ নয়।
এফজেএস 2

15
এটি কোনও সদৃশ নয় - বা অন্তত রেফারেন্সযুক্ত প্রশ্নের নয়। আমি এগুলির নিম্নোক্তদের বুঝতে পারি না - আপনি এসওকে জিজ্ঞাসা করতে পারবেন না এমন কিছু করার সবচেয়ে ভাল উপায় হাস্যকর এবং এই জাতীয় সংক্ষিপ্ত প্রশ্নের জন্য কোনও কোড উদাহরণের প্রয়োজন নেই। রেফারেন্সযুক্ত 'ডুপ্লিকেট'-এ +30 ভোট কীভাবে পাওয়া যায়, এবং এই সমান্তরাল কিন্তু বিবিধ প্রশ্নটি খুব অনুরূপ স্টাইলে জিজ্ঞাসা করা হয়, -3 ভোট রয়েছে? দয়া করে প্রশ্নটি পুনরায় পড়ুন এবং আপনার চিহ্নিত-হিসাবে-সদৃশ ভোটগুলি সরান। "সূচী" হ'ল প্রশ্ন শিরোনামে আপনার চিহ্নিত হওয়া মূল বাক্যাংশ।
প্যানকেক

বর্তমান পরামর্শ @Dancrumb stackoverflow.com/help/dont-ask নিরুৎসাহিত বিষয়ী প্রশ্ন শুধুমাত্র যদি যে উত্তর সমানভাবে প্রযোজ্য। এই ক্ষেত্রে, "সেরা" পরিষ্কারভাবে কর্মক্ষমতা, স্বচ্ছলতা এবং প্রকাশের দিক দিয়ে মূল্যায়ন করা যেতে পারে।
ব্যবহারকারী 234461

উত্তর:


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
@ এডি 1 এএন 0: একাধিক পাস করা সহজ উপায়। সর্বোচ্চটি সন্ধান করুন const max = arr.reduce((m, n) => Math.max(m, n)), তারপরে সর্বাধিকের সূচকগুলি [...arr.keys()].filter(i => arr[i] === max)
Ry-

[...arr.keys()]একটি ত্রুটি আউটপুট দেয়:unexpected token
এডি 1 এএন 0

@ ed1nh0: আপনি কোন ব্রাউজার / পরিবেশকে লক্ষ্য করছেন?
Ry-

ক্রোম। আমি ভ্যুজেএস ব্যবহার করছি এবং আমি অনুমান করি যে বিষয়টি ওয়েবপ্যাক কনফিগারেশনের কিছু something
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()পদ্ধতি সম্পর্কে (ডেভিড ফ্লানাগানের "জাভাস্ক্রিপ্ট: দ্য সংজ্ঞা নির্দেশিকা" থেকে):

হ্রাস () দুটি যুক্তি লাগে takes প্রথমটি হ'ল ফাংশন যা হ্রাস অপারেশন সম্পাদন করে। এই হ্রাস ফাংশনের কাজটি হ'ল এককভাবে দুটি মানকে একক মানতে একত্রিত করা বা হ্রাস করা এবং সেই হ্রাসকৃত মানটি ফিরিয়ে দেওয়া।

হ্রাস () এর সাথে ব্যবহৃত ফাংশনগুলি ফর ইচ () এবং মানচিত্র () এর সাথে ব্যবহৃত ফাংশনের চেয়ে আলাদা। পরিচিত মান, সূচক এবং অ্যারের মানগুলি দ্বিতীয়, তৃতীয় এবং চতুর্থ আর্গুমেন্ট হিসাবে পাস করা হয়। প্রথম যুক্তি হ'ল এখন পর্যন্ত হ্রাসের জমে থাকা ফলাফল। ফাংশনটির প্রথম কলটিতে, এই প্রথম যুক্তি হ'ল প্রাথমিক মান যা আপনি দ্বিতীয় আর্গুমেন্ট হিসাবে () হ্রাস করার জন্য পাস করেছেন। পরবর্তী কলগুলিতে এটি ফাংশনের পূর্ববর্তী অনুরোধের মাধ্যমে ফিরে আসা মান।

আপনি যখন কোনও প্রাথমিক মান ছাড়াই () হ্রাস করার অনুরোধ করবেন তখন এটি অ্যারের প্রথম উপাদানটিকে প্রাথমিক মান হিসাবে ব্যবহার করে। এর অর্থ হ্রাস হ্রাস ফাংশনের প্রথম কলটিতে তার প্রথম এবং দ্বিতীয় আর্গুমেন্ট হিসাবে প্রথম এবং দ্বিতীয় অ্যারের উপাদান থাকবে।


12
@ ট্র্যাক্সিয়াম আপনার ব্যাখ্যা দুর্দান্ত হলেও উদাহরণস্বরূপ আরও কম সংখ্যক ফাংশনাল প্রোগ্রামিংয়ের ক্ষেত্রে আরও স্পষ্ট হতে পারে যদি আমরা আরও বর্ণনামূলক ভেরিয়েবল ব্যবহার করি। বলুন, arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);, যেমন বর্ণনা করা যায় যা: বারবার অ্যারের সূচক 0 (2nd প্যারামিটার) থেকে শুরু, যদি currentlyTestedValue এ উপাদান এর মান বেশী bestIndexSoFar , তারপর ফিরে currentlyTestedIndex যেমন পরবর্তী পুনরাবৃত্তিতে করতে bestIndexSoFar
নিনিয়ি

1
@ ট্র্যাক্সিয়াম দুর্দান্ত উত্তর আমিও একমত সঙ্গে @niieani এখানে একটি বাস্তব জগতে উদাহরণ আমি বাস্তবায়িত হল: this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
ড্যানিয়েল

2
@ ড্যানিয়েলক, "পূর্ণ" পরামিতি নামের উত্তরগুলি একটি স্ট্যাকওভারফ্লো লাইনে ফিট করে না। একটি অনুভূমিক স্ক্রোল বার উপস্থিত হবে এবং অনুভূমিকভাবে স্ক্রোল করার সময় স্নিপেট পড়তে খুব সুবিধাজনক হবে না। যাইহোক পরামর্শের জন্য ধন্যবাদ। আমি উত্তরটি অন্যভাবে সম্পাদনা করেছি।
ট্রেক্সিয়াম

এফপি সমাধানের জন্য @ ট্র্যাক্সিয়াম +1 করুন। যদিও এর জঘন্যভাবে জেএস দিয়ে শুরু করা কারও পক্ষে জটিল, আপনার সমাধানটি ওপির সমস্যা সমাধানের জন্য অন্যতম পারফরম্যান্স হতে পারে to
সিওয়ারারিওর 404

Jsben.ch/UXXlk এর মতে , অন্য পদ্ধতিটি দ্রুত।
ভিএফডান

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 এর অ্যারের মধ্যে কোথায় রয়েছে তার সূচকটি ফিরিয়ে দেবে, এই ক্ষেত্রে ২।


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

সময়ের জটিলতা হ'ল অনুলিপিটির জন্য ও (এন), বাছাইয়ের জন্য ও (এন * লগ (এন)) এবং সূচিপত্রের জন্য ও (এন)।

আপনার যদি এটি আরও দ্রুত করার দরকার হয়, রাইয়ের উত্তর হ'ল ও (এন)।


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

এই প্রসঙ্গে "স্থিতিশীল" এর অর্থ কী?
রাই-

আমি অনুমান করি তিনি "উপযুক্ত" বলতে চেয়েছিলেন
Ikbel

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

দুঃখিত আমি পোস্টটি স্পষ্টভাবে পড়িনি এখন আমি কোডটি আপডেট করব
বিদ্যেশ

দয়া করে আপনার উত্তরটি আরও খানিকটা ব্যাখ্যা করুন (ডাউনভোটগুলি অপসারণ করতে সহায়তা করে) এবং অন্যান্য উত্তর থেকে এটি পৃথক করার চেষ্টা করুন (অর্থাত: কম সংস্থান ব্যবহার করে বা গণনায় দ্রুততর ... ইত্যাদি)। (নিম্নমানের উত্তর পর্যালোচনার সমাপ্তি)।
ZF007

এটি ফেরত দেয় না সর্বাধিক মানের সূচকটি ; এটি সর্বাধিক ধনাত্মক মান প্রদান করে।
Cœur
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.