J'ai ceci:
var arr = [0, 21, 22, 7];
Quel est le meilleur moyen de retourner l'index de la valeur la plus élevée dans une autre variable?
C’est probablement le meilleur moyen, car il est fiable et fonctionne sur les anciens navigateurs:
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;
}
Il y a aussi ce one-liner:
let i = arr.indexOf(Math.max(...arr));
Il effectue deux fois plus de comparaisons que nécessaire et jettera cependant un RangeError
sur de grands tableaux. Je m'en tiendrai à la fonction.
En une ligne et probablement plus vite que 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"
Où:
iMax
- le meilleur index jusqu'à présent (l'indice de l'élément max jusqu'à présent, lors de la première itération iMax = 0
, car le deuxième argument de reduce()
est 0
], nous ne pouvons pas omettre le deuxième argument de reduce()
dans notre cas)x
- l'élément actuellement testé du tableaui
- l'index actuellement testéarr
- notre tableau ([0, 21, 22, 7]
)À propos de la méthode reduce()
(extrait de "JavaScript: le guide définitif" de David Flanagan):
reduction () prend deux arguments. Le premier est la fonction qui effectue l'opération de réduction. La tâche de cette fonction de réduction consiste à combiner ou à réduire deux valeurs en une seule valeur et à renvoyer cette valeur réduite.
Les fonctions utilisées avec reduction () sont différentes de celles utilisées avec forEach () et map (). Les valeurs familières, les valeurs d'index et de tableau sont transmises en tant que deuxième, troisième et quatrième arguments. Le premier argument est le résultat cumulé de la réduction jusqu'à présent. Lors du premier appel à la fonction, ce premier argument est la valeur initiale que vous avez transmise en tant que second argument à réduire (). Lors des appels suivants, il s’agit de la valeur renvoyée par l’appel précédent de la fonction.
Lorsque vous appelez reduction () sans valeur initiale, il utilise le premier élément du tableau comme valeur initiale. Cela signifie que le premier appel à la fonction de réduction aura les premier et deuxième éléments du tableau comme premier et deuxième arguments.
Voici une autre solution, si vous utilisez ES6 avec un opérateur de propagation:
var arr = [0, 21, 22, 7];
const indexOfMaxValue = arr.indexOf(Math.max(...arr));
Sauf erreur de ma part, je dirais que c'est pour écrire votre propre fonction.
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;
}
Si vous utilisez un trait de soulignement, vous pouvez utiliser ce Nice one-liner:
_.indexOf(arr, _.max(arr))
Il recherchera d'abord la valeur du plus grand élément du tableau, dans le cas présent 22. Il renverra ensuite l'index de l'endroit où 22 se trouve dans le tableau, dans le cas présent 2.
reduce
:[1,2,5,0,4].reduce((a,b,i) => a[0] < b ? [b,i] : a, [Number.MIN_VALUE,-1])
//[5,2]
Ceci retourne [5e-324, -1]
si le tableau est vide. Si vous voulez juste l'index, mettez [1]
après.
>
et MAX_VALUE
):[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]
EDIT: Il y a des années, j'ai donné une réponse grossière, trop spécifique et trop compliquée. Donc je l'édite. Je privilégie les réponses fonctionnelles ci-dessus pour leur facteur net mais pas pour leur lisibilité; mais si je connaissais mieux javascript, je pourrais aussi les aimer pour cela.
Pseudo code:
Index de piste contenant la plus grande valeur. Supposons que l'indice 0 soit le plus grand au départ. Comparez avec l'index actuel. Mettez à jour l'index avec la plus grande valeur si nécessaire.
Code:
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
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]
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;
}
passez array
à haystack
et Math.max(...array)
à needle
. Cela donnera tout max éléments du tableau, et il est plus extensible (par exemple, vous devez aussi trouver les valeurs min)