• ベストアンサー

二次元配列について

こんにちは。いつもお世話になっております。 JavaScriptで二次元配列(配列の入れ子)を作ろうとしています。 ソースは下記のとおりです。 var menu = new Array("朝食","昼食","夕食"); menu[0] = new Array(); menu[0][0] = "コーヒー"; menu[0][1] = "牛乳"; menu[1] = new Array(); menu[1][0] = "サラダ"; menu[1][1] = "サンドイッチ"; menu[2] = new Array(); menu[2][0] = "天ぷら"; menu[2][1] = "刺身"; document.write(menu[0],"は",menu[1][0] + "<br>" ); 最後のwriteメソッドを使用して 「昼食はサラダ」と表示したいのですが「コーヒー,牛乳はサラダ」 になってしまいます。 どう記述すればいいでしょうか?ネットでいろいろ検索してみましたが 分かりませんでした。 よろしくお願い申し上げます。

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

  • ベストアンサー
  • chie65536
  • ベストアンサー率41% (2512/6032)
回答No.4

1次元配列menuと2次元配列menuで「別の物になる」と思っているようですが、実は「同じ物」です。 menu[0][0] = "コーヒー"; menu[0][1] = "牛乳"; は menu[0] = new Array("コーヒー","牛乳"); と書く事も出来ます。 つまり document.write(menu[0],"は",menu[1][0] + "<br>" ); の「menu[0]」の中身は「コーヒー,牛乳」です。 最初の行で「"朝食","昼食","夕食"」を入れているのは「まったく無意味」です。 「食事の種類」と「食事の内容」は、中身が違うので、以下のように「別の配列」にしなければなりません。 var menu1 = new Array("朝食","昼食","夕食"); var menu2 = new Array(); menu2[0] = new Array("コーヒー","牛乳"); menu2[1] = new Array("サラダ","サンドイッチ"); menu2[2] = new Array("天ぷら","刺身"); document.write(menu1[0],"は",menu2[1][0] + "<br>" );

nekotora
質問者

お礼

chie65536様 早速の回答ありがとうございました。 >>1次元配列menuと2次元配列menuで「別の物になる」と思っている >>ようですが、実は「同じ物」です。 >>「食事の種類」と「食事の内容」は、中身が違うので、以下のように >>「別の配列」にしなければなりません。 とても分かりやすい説明をありがとうございます。 全然分かっていなかった自分が恥ずかしいですが、入れ子にしただけで 別々の配列と思い込んでいました。 スクリプトを書き直しました。 本当にありがとうございました。

その他の回答 (3)

  • tkrn
  • ベストアンサー率53% (33/62)
回答No.3

#2です。 コピペミスしました。 > menu[0] = new Array(); ↑これは余計です。 > var menu = new Array("朝食","昼食","夕食"); で使われている変数名を別のもにに変えてくださいという意味です。

nekotora
質問者

お礼

tkrn様 早速の回答ありがとうございました。 > var menu = new Array("朝食","昼食","夕食"); で使われている変数名を別のもにに変えてくださいという意味です。 入れ子にしただけで、思った通りにできると勘違いしていました。 別の配列にしたら、できました。 本当にありがとうございました。

  • tkrn
  • ベストアンサー率53% (33/62)
回答No.2

var menu = new Array("朝食","昼食","夕食"); menu[0] = new Array(); この変数名を別のものに変えてあげましょう。 menu変数の二次元配列の表を作ってみればわかると思いますが、 menu変数に"朝食","昼食","夕食"の文字の入る余地がありませんよね。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

1行目でmenu[0]~[2]に文字列をセットしていますが、 2行目でmenu[0]に配列を指定している時点で文字列が消えてますね やり方がおかしいです。 それと仮にそれができたとしても document.write(menu[0],"は",menu[1][0] + "<br>" ); ではmenu[0]は「朝食」なのでは?? とりあえずこんな風にするとよいかと。 <script> var menu = new Object; menu["朝食"] = new Array("コーヒー","牛乳"); menu["昼食"] = new Array("サラダ","サンドイッチ"); menu["夕食"] = new Array("天ぷら","刺身"); var meal="昼食"; document.write(meal+"は"+menu[meal][0]); </script>

nekotora
質問者

お礼

yambejp様 早速の回答ありがとうございました。 >>2行目でmenu[0]に配列を指定している時点で文字列が消えてますね はい、その通りです。 入れ子にすれば配列も2種類で識別できると思い込んでいました。 この場合ArrayではなくObjectでもいいのですね。 本当にありがとうございました。

関連するQ&A

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

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

  • 配列の入れ子

    m=new Array(); m[1]=new Array(); m[1][0]="メニュー1"; m[1][1]="メニュー2"; m[1][1]=new Array(); m[1][1][0]="サブメニュー1"; m[1][1][1]="サブメニュー2"; m[1][2]="メニュー3"; ポップアップ式のメニューを作っています。タブがあり、マウスを乗せると「メニュー1,2,3」が下に表示され、「メニュー2」にマウスを乗せるとその右に更に「サブメニュー1,2」が表示されるというような具合です。 編集が簡単にできるように上のような入れ子の配列にしたのですが、エラーが発生します。試しに window.status=m[1][1][0]; としてみると「undefined」と表示されてしまいます。上の配列の構成はどこが間違っているのでしょうか?また、回避策などご教授お願いします。

  • 配列名の定義の仕方?

    配列名を操作したいのですがうまくいきません。やりたいことは下記の★部分で配列名を定義したいのですが、定義の方法がうまくいっていないようです。 //配列名と要素を設定 var station1 = new Array("東京","渋谷","新宿"); var station2 = new Array("横浜","藤沢","川崎"); var station3 = new Array("千葉","浦安","津田沼"); //★任意の番号を設定し配列名を定義 var no = 1; //ここでは仮に1とする var arrayName = "station" + no; ←ここで「station1」としたい document.write(arrayName[2]); 上記ではうまくいきません。どうやったらstation1という配列名を作って要素を取得できるのでしょうか?

  • 2つの配列を比較し、3つ目の配列に入れた後にソートする方法

    javascriptでとある人口の表を作成しようとしています。 そこで、2つの配列を比較して、同じ県名であれば数値を加算して3つ目の配 列に格納し、同じ県名がなかった場合はそのまま3つ目の配列に格納した後、 人口の多い場所から順に並べていくという方法が思いつきません。 (sort関数をどのように使用すればよいのかもわかりません。) var list1[0] = new Array("熊本",100); var list1[1] = new Array("長崎",200); var list1[2] = new Array("佐賀",300); var list1[3] = new Array("宮崎",450); var list2[0] = new Array("熊本",100); var list2[1] = new Array("長崎",200); var list2[2] = new Array("佐賀",300); var list2[3] = new Array("鹿児島",500); という形の2つの配列があった場合 var list3[0] = ["佐賀",600]; var list3[1] = ["鹿児島",500]; var list3[2] = ["宮崎",450]; var list3[3] = ["長崎",400]; var list3[4] = ["熊本",200]; 最終的にはこのような形になるようにしたいです。 どうか教えていただけないでしょうか。 よろしくお願いします。

  • 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();

  • 2つの配列を1つにするには?

    var listWords1 = new Array ("a","b","c","d"); var listWords2 = new Array ("e","f"); // という2つの配列を下のような一つの配列にするにはどうすればいいですか? var listWords3 = new Array ("a","b","c","d","e","f"); 試しに var listWords3 = new Array(); listWords3 = listWords1 + listWords2 などとやってみましたがやっぱりダメでした。(^^; またもやド素人の質問でごめんなさい。自分なりに様々なキーワードでgoogleしているのですが、基本的なことすぎるのか、なかなか答えをヒットすることができません。私のような初心者がJavaScriptを基礎の基礎から勉強できるサイトがありましたら、併せてご紹介いただけませんでしょうか?よろしくお願いいたします。m(_ _)m

  • AS3.0 二次元配列でムービークリップが出来ない

    Actionscript3.0 超初心者です。 二度目の質問です。  40x80のマス目をエクセルマクロが使えない人のためにFlashで表示させようとしています。 ライブラリーのMC mark_mcを二次元配列で並べようとしていますが、うまく行きません。 試しに一次元配列だと下記のコードでエラーが出なくうまく表示されます。 var mc_array:Array = new Array(); mc_array[3]=new mark_mc(); addChild(mc_array[3]); mc_array[3].scaleX = 0.5; mc_array[3].scaleY = 0.5; mc_array[3].x = 300; mc_array[3].y = 200; 二次元にして var mc_array:Array = new Array(); mc_array[3][2]=new mark_mc(); addChild(mc_array[3][2]); mc_array[3][2].scaleX = 0.5; mc_array[3][2].scaleY = 0.5; mc_array[3][2].x = 300; mc_array[3][2].y = 200; こうすると、TypeError: 「Error #1010: 条件は未定義であり、プロパティがありません。」が出てしまいます。 [3][2]の部分はfor文でデータをマス目に作ろうとしています。 基本的に間違っているのでしょうか?

    • ベストアンサー
    • Flash
  • 二次元配列に値をセットしたいんですが

    ASP(html)での変数をJavaScriptに渡して 二次元配列を作成したいのですが、どうもうまくいきません。 どなたか、ご教授願います。 サンプル 変数:strFact = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" -------------------JavaScript strFact_WK = <%=strFact %>  ※1 var test = new Array(); var rows = strFact_WK.split("/"); for( var i in rows) { test.push(new Array()); var cols = rows[i].split(","); for( var j in cols) { test[i].push(cols[j]); } } ---------------------- 当然ですが、 ※1の所で strFact_wk = "'工場1', 1000, 20/'工場2', 500, 90/'工場3', 2000, 100/'工場4', 900, 10" とすると作成されます。

  • 多次元配列と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文外で配列を使用できるのか教えてください!

  • 二次元配列に数字をランダムに入れる

    --------------------------- | 2 | 3 | 7 | 4 | 1 || 17 |<横合計> --------------------------- | 6 | 1 | 2 | 3 | / || // | --------------------------- | 1 | / | / | / | / || // | --------------------------- | 2 | / | / | / | / || // | --------------------------- | 3 | / | / | / | / || // | --------------------------- --------------------------- | 14 | / | / | / | / || // |<全合計> --------------------------- <縦合計> このように表示される。 …という処理がしたいのですがどういう処理を書けば良いのかわかりません。 理解した(1)と(2)の乱数発生の文を書いておきます。 *二次元配列を作成* a = new Array(5) for (i = 0; i <= a.length-1; i++){ //1次元 a[i] = new Array(5) for (j = 0; j <= a[i].length-1; j++){ //2次元 a[i][j] = "["+ i +","+ j +"]" var g = ""; document.write(a[i][j]); } } *乱数を100回発生* var z = ""; for(k = 1; k <= 100; k++){ z = Math.round(Math.random()); //発生した乱数をzに代入 } 以上、 よろしくお願いいたします。