web-dev-qa-db-ja.com

配列内の最大値のインデックスを返します

私はこれを持っています:

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

最高値のインデックスを別の変数に返す最良の方法は何ですか?

112
Stephen

信頼性が高く、古いブラウザで動作するため、これがおそらく最良の方法です。

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

ただし、必要な2倍の比較を実行し、大きな配列ではRangeErrorをスローします。私は機能に固執します。

137
Ry-

1行で、おそらく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 = 0reduce()の2番目の引数が0であるため、この場合、reduce()への2番目の引数を省略します)
  • x-配列から現​​在テストされている要素
  • i-現在テストされているインデックス
  • arr-配列([0, 21, 22, 7]

reduce()メソッドについて(David Flanagan著「JavaScript:The Definitive Guide」より):

reduce()は2つの引数を取ります。 1つ目は、リダクション操作を実行する関数です。この削減関数のタスクは、何らかの方法で2つの値を1つの値に結合または削減し、その削減された値を返すことです。

Reduce()で使用される関数は、forEach()およびmap()で使用される関数とは異なります。おなじみの値、インデックス、および配列の値は、2番目、3番目、および4番目の引数として渡されます。最初の引数は、これまでの削減の累積結果です。関数の最初の呼び出しで、この最初の引数は、reduce()の2番目の引数として渡した初期値です。後続の呼び出しでは、関数の前の呼び出しで返された値です。

初期値なしでreduce()を呼び出すと、配列の最初の要素が初期値として使用されます。つまり、リダクション関数の最初の呼び出しでは、最初と2番目の引数として最初と2番目の配列要素が使用されます。

73
traxium

次に、スプ​​レッド演算子を使用してES6を使用している場合の別のソリューションを示します。

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

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

誤解がない限り、独自の関数を作成することです。

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

アンダースコアを利用している場合、このニースの短いワンライナーを使用できます。

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

最初に配列内の最大項目の値、この場合は22を見つけます。次に、配列内の22のインデックス、この場合は2を返します。

5
Kevin

reduceを使用したmaxの別のソリューション:

[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]
4
randompast

編集:何年も前に、私はこれに答えを出しました。だから私はそれを編集しています。上記の機能的な回答は、読みやすさではなく、きちんとした要素が好きです。しかし、もし私がjavascriptに精通していれば、そのためにもJavaScriptが好きかもしれません。

擬似コード:

最大値を含むトラックインデックス。最初はインデックス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
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;
}

arrayhaystackに、Math.max(...array)needleに渡します。これにより、配列のall max要素が得られ、より拡張性が高くなります(たとえば、最小値を見つける必要もあります)

0
Edward Karak