javascriptの

配列の要素が文字列で返ってくる場合、
var graph1_array = ["3","5","10","30","33","1","6"];

最大値のインデックスを知る良い方法はありますでしょうか。
Number()などは、変数を数値変換するもので、配列を数値に
変えてくれるメソッドはないようです。。。

最大値のインデックスは、要素が文字列のため、現状-1で返ってきてしまいます。

回答の条件
  • URL必須
  • 1人5回まで
  • 登録:2009/09/11 16:08:17
  • 終了:2009/09/11 17:26:44

ベストアンサー

id:i4ooon No.3

regnif回答回数56ベストアンサー獲得回数202009/09/11 17:03:14

ポイント50pt

前回ご質問の回答者です。

> 配列の要素が文字列で返ってくる場合、

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

> 最大値のインデックスを知る良い方法はありますでしょうか。

それこそ前回の私の回答(http://q.hatena.ne.jp/1252577402)で問題ないです。がIE問題があるようなのでGoldenDawnさんのやり方を拝借して。

<script language="JavaScript"></p> <p>if (!Array.prototype.indexOf) Array.prototype.indexOf = function(v) {</p> <p> for (var i = 0; i < this.length; ++i) if (this[i] == v) return i ;</p> <p> return -1 ;</p> <p>}</p> <p>var graph1_array = ["3","5","10","30","33","1","6"];</p> <p>var max = graph1_array.slice(0).sort(function(a,b){return (parseInt(b) - parseInt(a));})[0];</p> <p>var index = graph1_array.indexOf(max);</p> <p>alert("max:" + max + "/index:" + index);</p> <p></script>

でしょうか。

前回の配列は数値だったので、コメントには、parseInt不要と書いています。

id:nagayaki

前回はありがとうございました。

prototypeを使わない場合、どのようなコードになりますでしょうか。

2009/09/11 17:07:16

その他の回答(2件)

id:chrono1742 No.1

chrono1742回答回数91ベストアンサー獲得回数132009/09/11 16:37:14

ポイント27pt

逐次、Number関数を使って比較することで計算できますよ。

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


<script type="text/javascript">
function getMaxId(arr) {
  if (arr.length == 0) {
    return -1;
  }
  var maxId = 0;
  for (var id = 1; id < arr.length; id++) {
    if (Number(arr[id]) > Number(arr[maxId])) {
      maxId = id;
    }
  }
  return maxId;
}

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

document.write(maxId);
</script>
id:nagayaki

やはり逐次していくしかないのですね。。。

2009/09/11 17:01:11
id:GoldenDawn No.2

GoldenDawn回答回数426ベストアンサー獲得回数812009/09/11 16:42:33

ポイント63pt

前質問の回答のやり方を拝借して……

Math.max は数値に直してくれるので indexOf に渡すときに toString で文字列に戻してやります。

// IE 対策。他のライブラリ等で indexOf が補われているなら不要
if (!Array.prototype.indexOf) Array.prototype.indexOf = function(v) {
  for (var i = 0; i < this.length; ++i) if (this[i] == v) return i ;
  return -1 ;
}

Array.prototype.maxStringValueId = function() {
   return this.indexOf(Math.max.apply(null, this).toString()) ;
}

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

alert(graph1_array.maxStringValueId()) ;

前質問のコメントに書こうかと思いましたがついでなのでこちらに。

IE には indexOf がないのでコードに書いたように補ってやる必要があります。

また要素数が多いと WebKit は apply でスタックがオーバーフローします。

手元の環境では

Google Chrome 2.0.172.43 : 130980

Safari 4.0.3 : 524246

を超える要素数でアウトです。

http://q.hatena.ne.jp/

id:nagayaki

早速のレスありがとうございます。prototypeは使ったことがないです。。。

jqueryを使うとどんな感じになるのでしょう・・・

2009/09/11 16:59:12
id:i4ooon No.3

regnif回答回数56ベストアンサー獲得回数202009/09/11 17:03:14ここでベストアンサー

ポイント50pt

前回ご質問の回答者です。

> 配列の要素が文字列で返ってくる場合、

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

> 最大値のインデックスを知る良い方法はありますでしょうか。

それこそ前回の私の回答(http://q.hatena.ne.jp/1252577402)で問題ないです。がIE問題があるようなのでGoldenDawnさんのやり方を拝借して。

<script language="JavaScript"></p> <p>if (!Array.prototype.indexOf) Array.prototype.indexOf = function(v) {</p> <p> for (var i = 0; i < this.length; ++i) if (this[i] == v) return i ;</p> <p> return -1 ;</p> <p>}</p> <p>var graph1_array = ["3","5","10","30","33","1","6"];</p> <p>var max = graph1_array.slice(0).sort(function(a,b){return (parseInt(b) - parseInt(a));})[0];</p> <p>var index = graph1_array.indexOf(max);</p> <p>alert("max:" + max + "/index:" + index);</p> <p></script>

でしょうか。

前回の配列は数値だったので、コメントには、parseInt不要と書いています。

id:nagayaki

前回はありがとうございました。

prototypeを使わない場合、どのようなコードになりますでしょうか。

2009/09/11 17:07:16
  • id:GoldenDawn
    prototype はいわゆる prototype.js とは関係ないのでこのまま動くはずです。
    ついでに訂正。
    for (var i = 0; i < this.length; ++i) if (this[i] == v) return i ;
    は等号を一つ増やして
    for (var i = 0; i < this.length; ++i) if (this[i] === v) return i ;
    にしてください。
  • id:nagayaki
    GoledenDawnさん

    本当に無事動きました。ありがとうございました。
  • id:edvakf
    直接関係ないけど、

    if (!Array.prototype.indexOf) Array.prototype.indexOf = function(v) {
    var i = -1, l = this.length;
    while (++i < l) if (this[i] === v) return i ;
    return -1 ;
    }

    のほうが速いかな。

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

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

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

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません