web-dev-qa-db-fra.com

Renvoie l'index de la plus grande valeur dans un tableau

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?

112
Stephen

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.

137
Ry-

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 tableau
  • i - 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.

73
traxium

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

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;
}
6
Dan Tao

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.

5
Kevin

Une autre solution de max utilisant 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.

Min via (Changer en > et MAX_VALUE):

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

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
1
ross studtman
 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]
0
mos wen
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)

0
Edward Karak