175

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

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

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

4

12 に答える 12

206

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

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、大きな配列では をスローします。私は機能に固執します。

于 2012-07-02T21:29:58.167 に答える
107

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 = 0では の 2 番目の引数reduce()がであるため、この場合0は の 2 番目の引数を省略できませんreduce())
  • 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() を呼び出すと、配列の最初の要素が初期値として使用されます。これは、リダクション関数の最初の呼び出しが、1 番目と 2 番目の配列要素を 1 番目と 2 番目の引数として持つことを意味します。

于 2015-06-15T17:04:07.053 に答える
8

を使用した max の別のソリューション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]後ろに置きます。

>Min via (とに変更MAX_VALUE):

[1,2,5,0,4].reduce((a,b,i) => a[0] > b ? [b,i] : a, [Number.MAX_VALUE,-1])
//[0, 3]
于 2017-08-10T07:44:09.030 に答える
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;
}
于 2012-07-02T21:31:14.610 に答える
0

編集: 何年も前に、私はこれに対して粗野で、具体的すぎて、複雑すぎる回答をしました。なので編集中です。上記の機能的な回答は、きちんとした要素があり、読みやすさはありません。しかし、私が 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
于 2015-10-31T18:26:34.440 に答える