• 締切済み

JavaScriptでの動的な多次元配列の生成方法

JavaScriptで多次元配列を生成する方法を教えて頂きたく思います。 現在下記の様なコードを作成しています。 resArrayNowという多次元配列を作っておいて、[name][point1][point2] というnx3次元配列を動的に作成したいと思っています。 しかし、下記の様なプログラムを作成したところ、 if(resArrayNow.length==0){ の中入ったところで、実行されなくなっているようで上手くいきません。 どなたか、JavaScriptの多次元配列を動的に作成していく方法をご教授下さい。 宜しくお願いいたします。 ----------------------------------------------------------------------- var resArrayNow = Array(); arrayAdd("tom,1,45"); arrayAdd("ken,2,61"); arrayAdd("mike,33,5"); function arrayAdd(msg){ // カンマで分割し配列に格納 var resArray = msg.split(","); /*resArrayNowに格納されているIPアドレスと同じアドレスからのメッセージ * だった場合はx,yの値を更新、アドレスがなかった場合は新たに配列を追加する */ if(resArrayNow.length==0){ resArrayNow[0][0]=resArray[0]; resArrayNow[0][1]=resArray[1]; resArrayNow[0][2]=resArray[2]; alert(resArrayNow.length); } else{ for(var i = 0;i < resArrayNow.length;i++){ if(resArrayNow[i][0] == resArray[0]){ resArrayNow[i][1]=resArray[1]; resArrayNow[i][2]=resArray[2]; }else if(i== resArrayNow.length-1){            /*最後までIPアドレスを探して一致するIPが *resArrayNowになかった場合は新たに配列を追加する。 */ resArrayNow[i+1][0]=resArray[0]; resArrayNow[i+1][1]=resArray[1]; resArrayNow[i+1][2]=resArray[2]; } } } }

みんなの回答

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.1

こんにちは。 resArrayNow[0][0]=resArray[0];でエラーが出ていますね。 resArrayNow[0] = new Array(); を前に追加すればエラーは消えると思います。 resArrayNowの0番目を配列にする宣言です。 なので後に実行される resArrayNow[i+1][0] = resArray[0];の前にも resArrayNow[i+1] = new Array(); で配列にしなければエラーになると思います。 ただ、動かしてみましたがコメントから推測される動作はしませんでした。 for内の更新か追加の判断がまずいです。 恐らく下記で目的の動作が出来ると思うのですがいかがでしょうか。 (IPアドレスをキーにしています) ============================================= var resArrayNow = new Array(); arrayAdd("1.1.1.1,1,1"); arrayAdd("1.1.1.2,2,2"); arrayAdd("1.1.1.3,3,3"); arrayAdd("1.1.1.2,4,4"); // 配列の中身を確認してみる for ( i in resArrayNow ) { alert ( "ip = [" + resArrayNow[i][0] + "]\nx=" + resArrayNow[i][1] + ",y=" + resArrayNow[i][2] ); } function arrayAdd(msg){ var resArray = msg.split(","); // resArray[0](IPアドレスを想定)をキーに連想配列としてresArrayを代入 resArrayNow[resArray[0]] = resArray; } ============================================= かなりシンプルですがこれでコメントにある IPアドレスと同じアドレスだった場合はx,yの値で常に上書きされます。 結果、IPアドレスがなければ追加されますし、IPアドレスがあればresArrayで更新されます。 こんな方法もあります。

関連するQ&A

  • Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。

    Javascriptで二次元配列で高次元の配列サイズを取得する方法を教えてください。 var data = [ [1,2,3], [4,5,6], [7,8,9] ]; for (var i = 0; i < data.length; i++){ for (var j = 0; j < data[i].length; j++){ <--- ここで lengthのオブジェクトがNullというエラーになります。 alert(data[i][j]); } } よろしくお願いいたします。

  • javascriptの2次元配列をソートの仕方

    function word_grouping(data) { var code = data; //先頭についている”code="を除去 code = code.replace("code=",""); var = code.split(","); var alpha =new Array(); alpha = ['A','B','C','D','E','F','G','H','I','J','K','L','M']; //2次元配列作成 var array = new Array(); for (i =0; i < alpha.length; i++) { array[i] = [' ','0']: } //グループ名を格納 for( i = 0; i <alpha.length; i++){ array[i][0] = alpha[i] //0番目の項目から順番にグループごとに分ける for( i = 0; i < sp.length; i++){ group = sp[i].substring(0.1); //どのグループに所属しているか調べる for( j = 0; j < alpha.length; j++){ //一致したグループの配列にカウント+1していく if(group == array[j][0]{ array[j][1]++; } } } メモ ・spにはグループのどこかに所属する20個のキーワードが入っていてそれをグループに振り分けている ・グループ分けには”A001”のAだけみて振り分けています したいこと ・arrayに入ったキーワードの数を降順で並び替えたい 分からない所 ・2次元配列をsortする仕方 こんな感じなんです わかる方回答お願いします。

  • javascriptでhiddenに二次元配列を格納したい

    現在、Webのシステムでクライアント側のJavaScriptから サーバー側のPHPに値を渡そうと思ってます。 その際に、JavaScriptの配列と連想配列を組み合わせた二次元配列に 値を格納してサーバー側に渡そうと思ってます。 それで以下のような方法を試しているのですが、 hiddenに二次元配列を格納する方法が分からず困ってます。 分かる方がいらしたら教えて頂けますでしょうか。 よろしくお願いいたします。 =========================================== var actionName = document.forms[0].action; var bodyObj = document.body; var formObj = document.createElement("FORM"); var hiddenObj = document.createElement("HIDDEN"); formObj.name = "updateTest"; formObj.action = actionName; formObj.method = "post"; hiddenObj.name = "alltest[][]"; var norArr = new Array(); var hashArr = new Array(); var i = 1; hashArr['test'] = document.getElementById("test" + i).value; norArr[i-1] = hashArr; hiddenObj.value = hashArr; formObj.appendChild(hiddenObj); bobyObj.appendChild(formObj); formObj.submit();

  • 多次元配列とfor文について

    javascriptの配列について質問です。 例えば: var arrXXX = new Array(); function samplefunc{ //3次元配列の種類の作成 for (m = 0; m < aaa.length ; m++) { //連想配列作成 arrXXX .push(aaa[m]); } for (j = 0; j < bbb.length; j++) { for (i = 0; i < ccc.length; i++) { arrXXX[aaa[j]] = new Array(ccc.length); arrXXX[aaa[j]][i] = new Array(ccc.length); for (k = 0; k < ddd.length; k++) { arrXXX[aaa[j]][i][k] = eee;     ここでは配列を適切に使える・・・ } } } ここでarrXXXを使いたいが、3次元配列でなくなっている?!  arrXXX[~][0][0]はnullまたはオブジェクトではありません・・・がでます。 } 結局、for文を完全にでてしまうと、せっかくつくった配列がダメになってしまいます。どうすればfor文外で配列を使用できるのか教えてください!

  • C# 配列の配列(多次元配列?)

    C#において、配列の配列中に格納した値を、検索することを 行いたいのですが、格納した値そのものを見ることができません。 まだ、C#を始めて間もないので、配列に格納する時点で、 不備があるかも知れませんが、お願いします。 やりたいこと ・テキストファイル内にある値を、2次元配列または、多次元配列に格納 ・配列に格納した値で、データチェックなどを行う予定  テキストファイル内のデータは、下記内容となり要素数も固定ではなく変動する   A=1,2,3・・・   B=11,22,33・・・ 実際のソースは、 //配列 ArrayList list = new ArrayList(); //配列格納 1レコード毎用 ArrayList listtmp = new ArrayList(); while ((strGenderTextLine = objReader.ReadLine()) != null) {  string strBuffer;  //「=」前の値格納用変数  string[] strBuffer2; //「=」後の値格納用配列  listtmp=null;  //strtmpに「=」前の値を格納  strtmp = TextLine.Split('=').GetValue(0).ToString();  //strtmp2に「=」後の値を格納(配列)  strtmp2 = TextLine.Split('=').GetValue(1).ToString().Split(',');  for (int i = 0; i <= strtmp2.Length - 1; i ++)  {   //[i,0]に、「=」前の値を代入   if (i == 0)   {   listtmp.Add(strtmp);   }   else   {   listtmp.Add(strtmp2[i].ToString());   }  }  //list配列にlistTmp配列を格納(配列の配列)  list.Add(listtmp);  intT = intT + strtmp2.Length;  //行数カウント  intTLine = intTLine + 1;  } ここから、配列「list」内に入っている値を閲覧することができる方法を教えていただければと思います。 宜しくお願いいたします。

  • JavaScriptで2次元配列を扱う方法

    C言語を少しだけやっていました。 JavaScriptで2次元配列作りたいのですが、上手くいきません。 var array[5][5]; array[0][0] = 21; document.write(array[0][0]); ↑を実行しても「21」と表示されません。 new array()とか色々試しましたが上手くいかないので質問させていただきました。 教えてください!

  • 配列について、その要素を並べ替えて得られる配列を重複することなく全て得たいです。

    要素数が5つなら5!で120通り、nであればn!通りの配列をすべて得たい、といった具合です。 自分で組んでみたところ、再帰呼び出しを多用しているせいか要素を8つにした時点でFirefoxだと「このページのスクリプトは処理に時間がかかっているか応答しなくなっています。…」、IEでも似たような警告文が表示されてしまいます。 コードは以下に示すとおりです。 そこでお聞きしたいのは、  1.「処理に時間が~云々」などの表示をさせずに処理を   続けさせるにはどのように書いたらいいか  2.もっと短くスマートなコードで全走査できないか の2つです。 1.についてはユーザサイドでなく開発者サイドで、かつalertを使う以外の方法で、警告文を出させないで処理を続けさせるためにはコードをどのようにしたらよいでしょうか。 2.に関しては、私が書いたコードは正直わかりにくいと思いますので、もっとシンプルに全走査できるアルゴリズムがあったら教えてほしいです。 どうかよろしくお願いします。 <html> <body> <script type="text/javascript"> <!-- //Arrayオブジェクトに自身をコピーした配列を返すclone()メソッド追加 Array.prototype.clone = function(){ // 自分自身が配列かをチェック if(this[0].constructor == Array ){ var ar, n; //新しい配列を用意する ar = new Array(this.length); for(var n=0;n<ar.length;n++){ //再起呼び出しで配列の中身をコピー ar[n] = this[n].clone(); } //作成した配列を返す return ar; } return Array.apply(null,this); } //★要素を並べ替える前の配列の宣言 var ar = new Array("1","2","3","4","5","6","7","8"); //並べ替え後の配列を格納する配列宣言 var arranged_ar = new Array(); function arArrange(){ //引数は(呼び出した節の、並び替える前の配列内での順番,すでに取り出した節の配列,兄弟の配列) function createBranch(parentCounter,parentNodes,sameDepthBranches){ var branches = new Array(); //呼び出した節の子ノード格納用の配列宣言 branches = sameDepthBranches.clone(); //呼び出した節の兄弟をコピー branches.splice(parentCounter,1) //呼び出した節を除いて子ノードの配列作成完了 var pushed_ar = new Array(); //この節以前に登場した節を格納する(最終的に並べ替え終わった配列になる)配列宣言 pushed_ar = parentNodes.clone(); //呼び出し元のpushed_arをコピー for(var i=0;i<branches.length;i++){ pushed_ar.push(branches[i]); //pushed_arに子ノードを1つ追加 //走査が葉ノードに達したときの処理 if(pushed_ar.length == ar.length){ var length = arranged_ar.length; arranged_ar[length] = new Array(); for(var j=0;j<pushed_ar.length;j++){ arranged_ar[length].push(pushed_ar[j]); //arranged_arに並び替え後の配列を格納 } //走査がまだ葉ノードに達していない場合の処理 }else{ createBranch(i,pushed_ar,branches); //自身を再帰呼び出しすることで葉ノードに達するまでループ } //子ノード以下の走査が終わった場合の処理 pushed_ar.splice(pushed_ar.length-1,1); //追加した子ノードを削除して次の子ノード追加へ } return; } //↑で宣言したcreateBranch関数の呼び出し for(i=0;i<ar.length;i++){ var tempAr = new Array(); tempAr.push(ar[i]); createBranch(i,tempAr,ar); } //結果をresultに格納 var result = ""; for(var i=0;i<arranged_ar.length;i++){ result += i+1 + ": "; for(var j=0;j<arranged_ar[i].length;j++){ result += arranged_ar[i][j] + ","; } result += "<br>"; } //結果を画面に表示 document.getElementById("result").innerHTML = result; return; } --> </script> <input type="button" value="全並べ替えパターン走査" onclick="arArrange();"> <p id="result">ここに結果表示</p> </body> </html>

  • javascriptの配列の検索について

    テキストエリアに入力された文章を、改行ごとで配列に格納 その後、特定の文字を検索し、特定の文字がある配列を見つけて 見つかったものに処理をかけたいです 現在、配列に格納するところまでできているのですが、その後の文字を検索するところで躓いてます。 配列をmatchで検索すると一番最初の配列にのみ処理をかけてしまっているのが現状です。 どなたかお知恵を貸していただけないでしょうか よろしくお願いします。 例 入力された文字列:                明日の時刻のお知らせ                開始時間:10時30分                受付開始は10時00分からとなっております。                遅れないようにお願いいたします。 検索する文字:  時間     ↓ 検索ワードを含む配列:開始時間:10:30     ↓これに処理かけて 出力:10:30 検索ワードが見つからない場合 出力:10:00 10:30 という形にしたいです。 プログラムは下記のように組みました。 //////////////////////////// <html> <head> <script language="JavaScript"> function tester(){ var str= document.getElementById('input_text').value; var time; var alltime; abc = str.split(/\r\n|\r|\n/); var g = ["開始時間"]; for (var i=0;i<abc.length;i++){ if(abc[i].match(g)){ time = abc[i].match(/\d{1,2}:\d{1,2}/g); if(time2 !=null){ alert(time); document.write(time); break; } }else{ alltime = str.match(/\d{1,2}:\d{1,2}/g); if(alltime !=null){ document.write(alltime); } }break; } } </script> </head> <body> <textarea id=input_text rows="10" cols="45"> </textarea><br> <input type=button onclick="tester()" value="start"> </body> </html>

  • JavaScriptで配列を取得したい

    お世話になります。 データベースから取得したリスト(可変)をフォームに設定したところ、 JavaScriptで配列を参照したところ、リストが1件の場合はエラー、 3件の場合は正常という現象がおき、困っております。 リストが1件の場合でも、配列に認識させたいのですが、 他の箇所も記述が多いためシンプルな手法を探しています。 よろしくお願い致します。 3件のレコードの場合、正常に処理される。 ---- HTML内 -------------- <input type="checkbox" name="chk_sel"> <input type="checkbox" name="chk_sel"> <input type="checkbox" name="chk_sel"> ---- JavaScript内 -------------- function test(){ var obj = document.form1.chk_sel; if (obj != null) { for(i=0;i<obj.length;i++){ if(obj[i].checked == true){ check_num++; } } } } ----------------------------- ■1件のレコードの場合、エラーになる (配列に認識されないらしく、obj.lengthが取得できない) ---- HTML内 -------------- <input type="checkbox" name="chk_sel"> ---- JavaScript内 -------------- function test(){ var obj = document.form1.chk_sel; if (obj != null) { for(i=0;i<obj.length;i++){ if(obj[i].checked == true){ check_num++; } } } } -----------------------------

  • 多次元配列の処理について

    多次元配列を扱った処理を行ないたいのですが、一部でnullを受け取ってしまい、処理を行うことができません。 引数の配列には次のようなテキストが入っています。 --配列の内容-- 0,名詞-一般,1,5, 0,名詞-数,2,6, 0,名詞-接尾-助数詞,3,7, -------------- この配列をコマンドラインに書き出すと正確に表示されます。 しかし、配列の内容を参照して処理を行なうと2列目の処理のときにnullを参照してしまいます。 プログラムは以下のとおりです。 ---プログラム--- public class Dist {   public static int zairyo(String[][] date) {    int a = 0;    int b = 0;    int c = 0;    int d = 0;    int e = 0;    if(date != null) {     int f = 0;     System.out.println("//Dist//");     for(int m = 0; m < date.length; m++) {      for(int n = 0; n < date[0].length; n++) {       if(date[m][n] != null) {        System.out.print(date[m][n] + "\t");        f++;        if(f == date[0].length) {         System.out.println("");         f = 0;        }       }      }     }     for(int i = 0; i < date.length; i++) {      if(date[i][1] != null) {       if(date[i][1] == "名詞-一般")        a++;       if(date[i][1] == "名詞-数")        b++;       if(date[i][1] == "名詞-接尾-助数詞")        c++;      }else System.out.println("2列目null");     }     int j = date.length - 1;     d = Integer.parseInt(date[j][2]);     e = Integer.parseInt(date[j][3]);    }else System.out.println("Dist:null");    if(a > 0 && b > 0 && c > 0 && d <= 10 && e <= 15) {     return 1;    }else return 0;   } } ------------------------ 原因は何なのでしょうか? ご教授お願いします。

専門家に質問してみよう