• ベストアンサー

多次元配列の2つ目の項目でソートするには?

今、とあるデータを csv と同じ形式で多次元配列にセットしています。 この多次元配列を for 文を使って TABLE タグを出力させて一覧表示しています。 データ部は数値順です。 function ListOut(){  var data = [   ["0x0140","CB_GETEDITSEL","エディット領域の選択範囲の取得",…], ←データは9項目ある(長いので省略)    :   ["0x0161","CB_INITSTORAGE","リストボックスのメモリ初期化",…],   [0,0,0,0,0,0,0,0,0], ←データの最後を表す  ];    for ( var i=0 ; table[i][0] != 0 ; i++ ){   ListOutSub( table, i ); ←ここで1データを TABLE 出力  } } 質問1:  『data』リストの2つ目の要素でアルファベット順にソートする方法が分かりません?  ソート方法が分かれば数値順以外にもアルファベット順で ListOutSub 関数などで一覧表示できる  と思っています。→データをアルファベット順にソートして定義するのは量からして避けたいです。  『sort』を使えば出来そうですが、第1引数に何を、どのように指定するのかが分かりません。  ※『ListOutSub』は自作関数で多次元配列の1データを TABLE タグで出力させるものです。 質問2:  データの最後を[0,0,…,0]として終わりを判定していますが、何かよい方法ありますか?  『table.length』を使ってみましたが上手く出来ませんでした。→『i < table.length』  多次元配列の場合では『length』は使えないのでしょうか?  指定方法が間違っているのならば正しい方法を教えて下さい。 上記の2つがわかる方、どうか教えてくれませんか? ちなみに JavaScrpit は今年始めたばかりの初心者です。→参考までに C/C++ 言語歴は14年 宜しくお願いします。→回答へのお礼は夕方以降になります。

質問者が選んだベストアンサー

  • ベストアンサー
  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.2

>『data』リストの2つ目の要素でアルファベット順にソートする方法が分かりません? Arrayオブジェクトのsortに渡す比較関数を自分で実装します。Cで言うとqsortに似た感じです。サンプルを書くとこんな感じです(面倒なのでチェックコードは入れてません)。 var cmpIdx = 1; function mySortFunc(arg1, arg2){ if(arg1[cmpIdx] == arg2[cmpIdx]){ return 0; }else if(arg1[cmpIdx] < arg2[cmpIdx]){ return -1; }else{ return 1; } } data.sort(mySortFunc); >『table.length』を使ってみましたが上手く出来ませんでした。 dataじゃなくてtableですか? tableならばtableをどうやって宣言しているか補足してください。

Oh-Orange
質問者

お礼

回答ありがとうございます。 サンプル付きと『Cで言うとqsort…』コメントのお陰で方法が分かりました。 分かると簡単ですね。 『cmpIdx』が『n個目の要素』という意味で、この変数で場所制御できるのですね。 非常に分かりやすかったです。 ありがとうございました。

Oh-Orange
質問者

補足

最後にもう一点アドバイスをお願いします。 よく見たら質問に間違いがありましたね。 配列の『var data』→『var table』でした。 今はデータの最後を『0,0,0,0,0,0,0,0,0』で判定していますが、別の関数に上記の table を 渡して、その中で上記と同じ for でいろいろと操作(リスト出力)しています。 一度はカウンタ変数と『table.length』とで比較して上手くいきますが、同様の関数が2つ あって、順番に2つ呼び出すとエラーになるのか HTML にリストが全く表示されませんでした。 どちらか一方だけ呼び出すと正常に HTML にリストが表示されます。→なぜ?ループ条件は同じなのに? 1つ目の関数はインデックスをリスト出力させる機能、 2つ目の関数はデータを分かりやすく解説したテーブルをデータ数だけ出力させる機能です。 以下に2つ目の関数を載せます。→ループ条件は『table[i][0] != 0』で行っています。 function MessageGuide(id,table){ ←質問で記述した『2次元配列データ』が渡される  for ( var i=0 ; table[i][0] != 0 ; i++ ){ ←『i < table.length』とすると動作が???   if ( table[i][3] != " " ){ ←データがある場合処理    var param = [ ←1次元配列にデータをセットし直す(MessageGuideSub 関数の引数にあわせる為)     table[i][0],     table[i][1],     table[i][2],     table[i][3],     table[i][4],     table[i][5],     table[i][6] + '<BR>' + MessageGuideTipMake(table[i][6]), ←文字列を作成     table[i][7],     MessageGuideSeeMake(table[i][8]), ←文字列を作成    ];        MessageGuideSub( id, param ); ←1データを『分かりやすい解説リスト』に出力    document.write( '\n' );   }  } } 多次元配列でも『table.length』で要素数が分かりますか? また『table[0].length』としたらどうなりますか? C言語では『DWORD table[30][9];』を 『sizeof(table) / sizeof(DWORD)』で全体の要素数[30]が、 『sizeof(table[0]) / sizeof(DWORD)』で要素数[9]が計算されます。 JavaScript ではどうなりますか? 最後のアドバイスをお願いします。

その他の回答 (1)

  • ANASTASIAK
  • ベストアンサー率19% (658/3306)
回答No.1

テーブルソートの基本です。ググればいくらでも出てきます。

Oh-Orange
質問者

お礼

助言ありがとうございました。 いつも『google』で検索しています。 検索キーワードは『ソート JavaScript』でした。 検索キーワードを『JavaScript テーブルソート』にした方がたくさん見つかりました。 助言ありがとう!

関連するQ&A