- ベストアンサー
多次元配列の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年 宜しくお願いします。→回答へのお礼は夕方以降になります。
- みんなの回答 (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をどうやって宣言しているか補足してください。
その他の回答 (1)
- ANASTASIAK
- ベストアンサー率19% (658/3306)
テーブルソートの基本です。ググればいくらでも出てきます。
お礼
助言ありがとうございました。 いつも『google』で検索しています。 検索キーワードは『ソート JavaScript』でした。 検索キーワードを『JavaScript テーブルソート』にした方がたくさん見つかりました。 助言ありがとう!
お礼
回答ありがとうございます。 サンプル付きと『Cで言うとqsort…』コメントのお陰で方法が分かりました。 分かると簡単ですね。 『cmpIdx』が『n個目の要素』という意味で、この変数で場所制御できるのですね。 非常に分かりやすかったです。 ありがとうございました。
補足
最後にもう一点アドバイスをお願いします。 よく見たら質問に間違いがありましたね。 配列の『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 ではどうなりますか? 最後のアドバイスをお願いします。