मेरे पास यह है:
var arr = [0, 21, 22, 7];
किसी अन्य चर में उच्चतम मूल्य के सूचकांक को वापस करने का सबसे अच्छा तरीका क्या है?
मेरे पास यह है:
var arr = [0, 21, 22, 7];
किसी अन्य चर में उच्चतम मूल्य के सूचकांक को वापस करने का सबसे अच्छा तरीका क्या है?
जवाबों:
यह शायद सबसे अच्छा तरीका है, क्योंकि यह विश्वसनीय है और पुराने ब्राउज़रों पर काम करता है:
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
बड़े सरणियों पर फेंक देगा , हालांकि। मैं फ़ंक्शन के लिए छड़ी हूँ।
const max = arr.reduce((m, n) => Math.max(m, n))
, फिर अधिकतम के अनुक्रमित हैं [...arr.keys()].filter(i => arr[i] === max)
।
[...arr.keys()]
एक त्रुटि उत्पन्न करता है:unexpected token
एक पंक्ति में और शायद तब तेज 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 () और मानचित्र () के साथ उपयोग किए जाने वाले फ़ंक्शन से भिन्न होते हैं। परिचित मूल्य, सूचकांक और सरणी मान दूसरे, तीसरे और चौथे तर्क के रूप में पारित किए जाते हैं। पहला तर्क है अब तक की कटौती का संचित परिणाम। फ़ंक्शन के पहले कॉल पर, यह पहला तर्क प्रारंभिक मूल्य है जिसे आपने कम करने के लिए दूसरे तर्क के रूप में पारित किया है ()। बाद की कॉल पर, यह फ़ंक्शन के पिछले आह्वान द्वारा लौटाया गया मान है।
जब आप कोई प्रारंभिक मान नहीं घटाते () लागू करते हैं, तो यह प्रारंभिक मान के रूप में सरणी के पहले तत्व का उपयोग करता है। इसका मतलब यह है कि कमी फ़ंक्शन के लिए पहली कॉल में पहले और दूसरे तर्क के रूप में पहले और दूसरे सरणी तत्व होंगे।
arr.reduce((bestIndexSoFar, currentlyTestedValue, currentlyTestedIndex, array) => currentlyTestedValue > array[bestIndexSoFar] ? currentlyTestedIndex : bestIndexSoFar, 0);
जिसे निम्न के रूप में वर्णित किया जा सकता है: 0 (2 पैरामीटर) से शुरू होने वाले सरणी को पुनरावृत्त करें, यदि वर्तमान में TestedValue , BestIndexSoFar पर मौजूद तत्व के मान से अधिक है , तो फिर वर्तमान में जमा किए गए IndexSoFar के रूप में अगले पुनरावृत्ति पर लौटें ।
this.methods.reduce((methodIndex, currentMethod, currentMethodIndex, methods) => currentMethod.price <= methods[methodIndex].price ? currentMethodIndex : methodIndex, 0)
:।
यहाँ एक और उपाय है, यदि आप स्प्रेड ऑपरेटर का उपयोग करके ES6 का उपयोग कर रहे हैं:
var arr = [0, 21, 22, 7];
const indexOfMaxValue = arr.indexOf(Math.max(...arr));
जब तक मैं गलत नहीं हूँ, मैं कहूँगा कि यह आपका अपना कार्य लिखना है।
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;
}
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]
संपादित करें: वर्षों पहले मैंने इस पर एक उत्तर दिया था जो सकल, बहुत विशिष्ट और बहुत जटिल था। इसलिए मैं इसका संपादन कर रहा हूं। मैं उनके स्वच्छ कारक के लिए ऊपर दिए गए कार्यात्मक उत्तरों का पक्ष लेता हूं लेकिन उनकी पठनीयता का नहीं; लेकिन अगर मैं जावास्क्रिप्ट से अधिक परिचित था, तो मैं उनके लिए भी पसंद कर सकता हूं।
छद्म कोड:
ट्रैक इंडेक्स जिसमें सबसे बड़ा मूल्य होता है। मान लें कि इंडेक्स 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
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
। यह सरणी के सभी अधिकतम तत्व देगा , और यह अधिक एक्स्टेंसिबल है (उदाहरण के लिए, आपको न्यूनतम मान भी खोजना होगा)
यदि आप सरणी की एक प्रति बनाते हैं और इसे अवरोही क्रमबद्ध करते हैं, तो प्रतिलिपि का पहला तत्व सबसे बड़ा होगा। मूल सरणी में आप इसके सूचकांक को पा सकते हैं।
var sorted = [...arr].sort((a,b) => b - a)
arr.indexOf(sorted[0])
कॉपी के लिए समय जटिलता O (n) है, O और (n *) सॉर्टिंग के लिए O और (n) indexOf के लिए।
यदि आपको इसे तेज़ी से करने की आवश्यकता है, तो Ry का उत्तर O (n) है।
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]
इस फ़ंक्शन का एक स्थिर संस्करण इस तरह दिखता है:
// 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;
}
सरल
maxarr: function(){
let maxval = 0;
let maxindex = null;
for (i = 0; i < arr.length; i++){
if (arr[i] > maxval) {
maxval = arr[i];
maxindex = i;
}
}
}