質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

2回答

736閲覧

JavaScript:多次元配列の出力について

aluminium

総合スコア7

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2020/10/12 20:06

初心者の学生です。どうぞ宜しくお願いいたします。

入力されたコースコードから配列内のコース名を返すプログラムの課題を解いています。
入力値から配列番号を取得するところまでは解けたのですが、
それを別の配列(出力用の配列)にどう保持したらいいかわからず、詰まってしまいました...

arrを配列化したいのですが、var arr[i] とするとエラーになってしまい...

お知恵をお借りできれば幸いです。お時間ありがとうございます。

ソースコード

JavaScript

1// 配列の宣言 2var courseCode = ["WEB222", "WEB322", "IPC244", "JAV745", "OOP244"]; 3var courseTitle = ["ウェブプログラミング基礎", "ウェブプログラミングツールとフレームワーク", "C言語入門", "Javaプログラミング", "オブジェクト指向プログラミング入門"]; 4 5// ユーザ入力 6var noOfCourse = prompt("今学期とったコースの数を入力してください: "); 7console.log("\n"); 8 // ユーザ入力の回数分リピート 9 for(i = 0; i < noOfCourse; i++) { 10 var inputCode = prompt("コースコードを入力してください: "); 11 if (courseCode.includes(inputCode)) { // 配列に入力値がある場合 12 var arr = (courseCode.indexOf(inputCode)); // 配列番号を取得 13 // <-- ここにユーザ入力用の配列を保持する処理を書くのでしょうか?? 14 var mark = prompt("\t成績を入力してください: "); 15 } 16 else { // 配列に入力値がない場合 17 console.log(`Error: ${inputCode} というコースコードはありません`); 18 noOfCourse++; // リピート回数をリセット 19 } 20 console.log("\n"); 21 } 22 23// 出力 24console.log("成績は以下のとおりです:"); 25 // ユーザ入力の回数分リピート 26 for(j = 0; j < noOfCourse; j++) { 27 console.log("----------"); 28 console.log(`コースコード: ${courseCode[arr]}`); 29 console.log(`コース名: ${courseTitle[arr]}`); 30 console.log(`成績: ${mark[j]}`); 31 }

出力画面

イメージ説明
↑arrが配列化されていないので、単に2番目に入力した値が出力されてしまいます...

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2020/10/12 20:43

>arrを配列化したい それは手段かと思います。「なぜ」そうしたいのか、「なにを」そうすべきなのか 全体から要件を考える必要があるのではないでしょうか。 単に配列にしたいだけならすぐです。カウンタでも何でも作ってカウントアップさせてそれを配列番号として入れていけばいいだけですから。 本当にそれだけで解決するのか?は考えてからのほうが良いです。 特にどういう形のデータが必要なのか 部分ですね。 ※ただ、課題とのことで元々回答は得られにくいとは思います。
gentaro

2020/10/13 00:39

なぜ先生に質問しないのか教えて下さい。 何のために授業料を払っているのか甚だ疑問です。
aluminium

2020/10/13 03:21

> m.ts10806 様 配列を配列に渡す処理で混乱してしまいました。意図がわかりにくかったようで申し訳ありません。次回は気を付けます。 > gentaro様 質問しても、教授は「100人以上生徒がいるから即対応できない」と言います。返信が課題の締切後にくることもあります。授業料... 私もそう思います。コロナで全てのクラスがオンラインになってしまい、気軽に質問できる環境は無くなってしまったことがとても残念です(以前は教室内にtutorもいて気軽に質問ができました)。Teratailの皆様にはいつも助けていただいており、本当に感謝しています。たかが学生の課題ですが、丸投げしているわけではなく、悩みに悩んで困った末に投稿させていただいていますので、どうかご勘弁ください。
guest

回答2

0

入力値から配列番号を取得するところまでは解けた

入力値は prompt() の結果を想定されていると思いますが、以下の4つのケースで想定した処理はできないはずです。

  1. キャンセルボタンがクリックされた
  2. 小数値が入力された
  3. 数値以外の文字列が入力された
  4. 整数値だが0より大きい値でない

「ユーザの様々な入力」を想像し、適切な切り分けを行う必要があります。

javascript

1var inputNum = void 0; 2while ( !inputNum ) { 3 inputNum = prompt( "1以上の整数を入力" ); // default = 1 を指定しても良い。 4 console.log( "prompt() の結果 :", inputNum, typeof inputNum, parseInt(inputNum) ); 5 6 if ( !isFinite(inputNum) || (inputNum = parseInt( inputNum )) < 1 ) { 7 inputNum = undefined; 8 } 9} 10console.log("入力された整数:", inputNum );

適切に処理するユーザ関数を用意し、意図した入力値を得られるように考えてみてください。

1以上の整数値を得る入力処理の例

javascript

1var inputInteger = function( message ) { 2 var rslt = undefined; // 古い処理系では void 0 3 while ( !rslt ) { 4 rslt = prompt( message ); 5 console.log( "prompt() > ", rslt, typeof rslt, parseInt(rslt) ); // 後で消す 6 7 if ( !isFinite(rslt) || (rslt = parseInt( rslt )) < 1 ) { 8 rslt = undefined; 9 } 10 } 11 return rslt; 12} 13console.log("入力された整数:", inputInteger("1以上の整数を入力") );

MDN

arrを配列化したいのですが

コード内で // 配列番号を取得 とコメントされていますが、変数名を arr ではなく、idx のプレフィックスを持たせた変数名に変えてみてください(混乱の原因です)。

// <-- ここにユーザ入力用の配列を保持する処理を書くのでしょうか??

i==0 のときに結果を格納する配列を初期化することになりそうです。
(2次元配列の指定がない場合、オブジェクトを連想配列代わりに使う方が楽に思います)。

投稿2020/10/12 22:49

編集2020/10/12 22:55
AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aluminium

2020/10/13 03:21

ありがとうございます。 仰るとおり、4つのケースは処理できていません。減点になると思いますので、時間の許すかぎり実装したいと思います。 arr は 提出前に idx に直したいと思います。
guest

0

ベストアンサー

こんにちは。

単に配列にしたいのであれば、

JavaScript

1let indexes = [];

配列として初期化してから

JavaScript

1indexes.push(1); // 要素「1」を末尾に追加

要素を追加していけば良いです。

気になったこと

  • varは時代遅れなので、特段の理由がない限りconstとletを使いましょう。
  • courseCode、courseTitleとして別の配列に入れるのは、コードとコース名がずれてしまう恐れがあり設計的に良くありません。

JSONを用いて以下のようにした方が綺麗です。

JavaScript

1const courses = [ 2 { "code": "WEB222", "name": "ウェブプログラミング基礎" }, 3 { "code": "WEB322", "name": "ウェブプログラミングツールとフレームワーク" }, 45]; 6 7// インデックス2のnameを取得 8const name = courses[2].name; 9 10// codeがWEB222のコースのインデックスを取得 11const index = courses.findIndex(course => course.code == "WEB222");

投稿2020/10/12 22:34

Automatic9045

総合スコア313

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

aluminium

2020/10/13 03:21

ありがとうございます。 何時間も試行錯誤して courseCode[i] = courseCode[arr]; としたところ、期待した動きになりました。 push で配列を追加するのは思いつきませんでした。 constとlet を使った方がよいということ、コードとコース名をまとめた方がいいというご意見が、とても参考になりましたのでベストアンサーにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問