javascriptで、配列の最大値のキーを取得するコードの書き方を教えて下さい。


例えば、下記の配列があった場合、
var graph1_array = [3,5,10,30,33,1,6];

どのように書くと、最大値33のキー[4]を取得できるのでしょうか。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/09/11 12:30:16
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:edvakf No.4

回答回数27ベストアンサー獲得回数12

ポイント70pt
var arr = [3,5,10,30,33,1,6]; 

alert( arr.indexOf(Math.max.apply(null,arr) ); //=> 4

hanabc さんのコードよりも倍ぐらい速いです。

配列をソートするようなのに比べると10倍〜100倍速いです。

id:nagayaki

凄すぎです。。。

2009/09/11 12:29:08

その他の回答3件)

id:hanabc No.1

回答回数20ベストアンサー獲得回数4

ポイント15pt

こんな感じでどうでしょう。

function getMaxId(arr) {
  if (arr.length == 0) {
    return -1;
  }
  var maxId = 0;
  for (var id = 1; id < arr.length; id++) {
    if (arr[id] > arr[maxId]) {
      maxId = id;
    }
  }
  return maxId;
}

var graph1_array = [3,5,10,30,33,1,6]; 
var maxId = getMaxId(graph1_array); // maxId => 4

なお、配列のサイズが0の場合は-1を返しています。

id:nagayaki

ちょっとコードが長いですね。。。

2009/09/11 05:55:47
id:van-dine No.2

回答回数108ベストアンサー獲得回数11

ポイント20pt
function getMaxId(arr)
{
  var sorted = arr.concat().sort(function(x, y){return y - x;});
  //arrの内容を変えずに降順ソート、最大値はsorted[0]
  for(var i = 0; i < arr.length; i++)
  {
    if(arr[i] == sorted[0])return i;
  }
  return -1
}

var graph1_array = [3,5,10,30,33,1,6]; 
WScript.Echo(getMaxId(graph1_array)); // 4

hanabcさんの内容と違うのは、graph1_arrayの要素数が大きい時に、

処理時間に差が出てくる点です。

(hanabcさんのは全ての値を調べますが、私のは最大の要素を見つけた時点で終了します)

id:nagayaki

処理時間は大切なポイントだと思います。

2009/09/11 05:56:17
id:i4ooon No.3

回答回数56ベストアンサー獲得回数20

ポイント29pt

var graph1_array = [3,5,10,30,33,1,6];

var max = graph1_array.slice(0).sort(function(a,b){return (parseInt(b) - parseInt(a));})[0];

var index = graph1_array.indexOf(max);

alert("max:" + max + "/index:" + index);

参考URL

配列の要素(値)から最大値を取得する 

http://www.24w.jp/study_contents.php?bid=javascript&iid=javascri...

配列を数字順にソートする

http://javascript-memo.seesaa.net/article/24833503.html

配列要素を検索する

http://www.openspc2.org/JavaScript/Ajax/ref/prototype.js/ver1.4/...

id:edvakf No.4

回答回数27ベストアンサー獲得回数12ここでベストアンサー

ポイント70pt
var arr = [3,5,10,30,33,1,6]; 

alert( arr.indexOf(Math.max.apply(null,arr) ); //=> 4

hanabc さんのコードよりも倍ぐらい速いです。

配列をソートするようなのに比べると10倍〜100倍速いです。

id:nagayaki

凄すぎです。。。

2009/09/11 12:29:08
  • id:matsubobo
    jQuery使ったら1行で。

    var graph1_array = [3,5,10,30,33,1,6];
    alert(jQuery.inArray(Math.max.apply(null,graph1_array), graph1_array));
  • id:i4ooon
    3番目の回答者です。
    maxを求めるときのparseIntは無くても正しく動きますね。
    var max = graph1_array.slice(0).sort(function(a,b){return (b - a);})[0];

    ということをコメントしようと思ったら、jQueryなら1行で。。。
    上には上がいますね。

    と思いましたが、これってインデックスの4しか取得できませんね。。。
  • id:van-dine
    4番の答えは、IEで動かないのでご注意を。
  • id:edvakf
    id:van-dine おー、そうでした!なんか互換性の問題があるような気がしてたんですが、やっぱり。。ご指摘ありがとうございます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません