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

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

新規登録して質問してみよう
ただいま回答率
85.47%
JavaScript

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

Q&A

解決済

3回答

275閲覧

javascriptで配列に空の配列を代入する意味がわからない(テトリス作成を勉強)

k373

総合スコア17

JavaScript

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

0グッド

0クリップ

投稿2019/06/11 09:11

javascriptでテトリスの作り方を勉強しています。
サンプルコードを見つけ、写経しながら理解に努めているのですが、どうも理解できない箇所があります。

javascript

1function rotate( current ) { 2 var newCurrent = []; 3 for ( var y = 0; y < 4; ++y ) { 4 newCurrent[ y ] = []; 5 for ( var x = 0; x < 4; ++x ) { 6 newCurrent[ y ][ x ] = current[ 3 - x ][ y ]; 7 } 8 } 9 return newCurrent; 10}

上記4行目のnewCurrent[ y ] = [];という箇所です。

newCurrent[ y ]に空の配列を代入する必要はなぜあるのでしょうか?

ご教授よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

ループ処理がどのように行われるか、実際に値を代入し処理を追ってみると分かりやすいと思います。僕も分からなくなった時は、「順番にプロセスを追ってみる」事で理解できる事がよくあります。

js

1var newCurrent = []; 2 3for ( var y = 0; y < 4; ++y ) { 4 newCurrent[ y ] = []; 5 6 7 ----- y = 0 ------------------------------ 8 newCurrent[0] = [] 9 10 newCurrent = [ 11 [] 12 ] 13 -------------------------------------------- 14 | 15 | 16 V 17 18 for ( var x = 0; x < 4; ++x ) { 19 newCurrent[ y ][ x ] = current[ 3 - x ][ y ]; 20 21 22 ----- y = 0, x = 0 --------------------------------------------- 23 newCurrent[0][0] = current[3][0] | 24 | 25 newCurrent = [ | 26 [n1] | 27 ] y = 0, x = 0 28 | 29 {{ current[3][0]が 恐らく数値だと思われるため、 | 30 ある数値をn1と表記して代入 }} | 31 V 32 ----- y = 0, x = 1 --------------------------------------------- 33 newCurrent[0][1] = current[2][0] | 34 | 35 newCurrent = [ | 36 [n1, n2] y = 0, x = 1 37 ] | 38 V 39 ----- y = 0, x = 2 --------------------------------------------- 40 | 41 ... y = 0, x = 2 42 | 43 V 44 45 ----- y = 0, x = 3 --------------------------------------------- 46 | 47 ... y = 0, x = 3 48 | 49 V 50 . . . . .. . . . .. . . . .. . . . .. . . . . 51 52 {{ 処理の流れ }} 53 → 外ループ y = 0 54 → 内ループ y = 0, x = 0123 55 → 外ループ y = 1 56 → 内ループ y = 1, x = 0123 57 58 --------------------------------------------------------------------- 59 60 } 61 } 62 63 -------------------------------- 64 newCurrent = [ 65 [n1, n2, n3, n4] 66 [o1, o2, o3, o4] 67 [p1, p2, p3, p4] 68 [q1, q2, q3, q4] 69 ] 70 -------------------------------- 71 72 73 74 75 return newCurrent; 76}

投稿2019/06/12 04:48

編集2019/06/12 05:03
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

k373

2019/06/12 16:39

とてもわかりやすく、ご丁寧な回答ありがとうございます。 二次元配列の内容がわかりやすく、まだなんとなくですが読み解けました。 しっかりと細部まで理解できるように、何度もコードを読み、解説サイトと照らし合わせながら理解します。 ありがとうございます!!
退会済みユーザー

退会済みユーザー

2019/06/13 04:13

二重ループ、2次元配列は、僕も最初理解するのに時間がかかりました????w 他の教授が書かれた書籍にも書いてあったのですが、処理を書き出してみるのはやはり有効な手段のように、今でも感じています???? ファイツです*.(๓´͈ ˘ `͈๓).*
guest

0

JavaScript

1newCurrent[ y ] = [];

この行をコメントアウトした場合、開発者ツールのコンソールで下記行のエラーを確認出来ます。
https://www.google.com/search?q=chrome+developer+tools

JavaScript

1newCurrent[ y ][ x ] = current[ 3 - x ][ y ];

代入しなかった場合、newCurrent[ y ] の値は何になるかを確認してみましょう。

JavaScript

1console.log(newCurrent[ y ]);

プロパティに代入し、その値を保存するには、対象が「Object型」てある必要があります。

Re: k373 さん

投稿2019/06/11 09:44

think49

総合スコア18166

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

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

k373

2019/06/12 16:36

ご回答ありがとうございます。 該当の行をコメントアウトしたところ、 Uncaught TypeError: Cannot set property '0' of undefined とのエラーが発生しました。 二次元配列の器が用意されていないため、xの0番目に値を代入できなかったのかと考察しております。
guest

0

js

1var newCurrent = [];

がどの過程で2次元配列に変わるのか考えてみましょう

投稿2019/06/11 09:22

oikashinoa

総合スコア2826

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問