見出し画像

予習編その2 配列「Vol.3 関数・配列:ノンプロ研初心者向けプログラミング講座【GASコース第9期】」

↓これの続きです。かなり参ってます。


GASのデータ型

おさらい。だんだん馴染んできた気がするが、説明せよと言われるとできない。

画像1


配列とは

botやメール下書きツールの作成を通じて理解しつつあるような気がするけど、どうだろう。

スプレッドシートの範囲(range)は0範囲はないが、配列はなぜか0から数えるというので名言bot作成のあたりでハマっていた。

配列のインデックスは0からはじまる。これ重要。

配列リテラル

リテラル、書き方。配列は [10, 30, 20, 40] のように括弧で示す。

演習3-08  配列の代入・参照

画像2

ひとセットをまとめて~sとする。英語的発想だなあと思う。余談だけど、英語の単数/複数の例外として、一匹でも数匹でもsheep(羊は群れていることが多いからとか何とか説明があった気がする)とかさ~、なんかもう、ひっかけというか、そういうもん、として覚えるしかない。逆に日本語の数助詞も、一匹、一個、一人、なんで違うのって言われても、そうなっているとしか。語学研究している人に言わせれば何かあるのかもしれないけど。

school of fish
魚群、魚の群れ

なんかも、初見ではぜんぜんわからなかった。メダカの学校???と思った。余談終わり。

function myFunction3_08({
 const members = ['Bob''Tom''Ivy'];
 console.log(members[0]);
 console.log(members[1]);
 console.log(members[2]);
 console.log(members);
 
 members[1] = 'Tim';
 console.log(members);
}

画像2

const members = ['Bob', 'Tom', 'Ivy']; これによって、
配列上は Bob=0 Tom=1  Ivy=2 であることがわかる。

なので console.log(members[0]); ならば Bobが表示される。

console.log(members); は配列のひとセット内のすべての値が出力されている。

members[1] = 'Tim'; によって、 1の値がTomからTimに書き換えられてる。

定数なのになぜ配列の要素の変更が可能?
・定数への再代入が不可
・配列自体の変更が不可というわけではない

演習3-09 lengthプロパティ

lengthは配列の要素数を取得する。括弧内の要素数だ。

function myFunction3_09({
 const members  = ['Bob''Tom''Jay''Tom'];
 console.log(members.length);
}

画像3

length

画像4



演習3-10 for文による配列のループ

function myFunction3_10({
 const members  = ['Bob''Tom''Jay''Tom'];
 for(let i = 0; i < members.length; i++) {
   console.log(members[i]);
 }
 for(const member of members) {
   console.log(member);
 }
}


for let~では、要素数を条件式(上限数)としてforの中の処理を回している。

for of では、それが  x of xs で表されておるのが変な感じ。

画像5

演習3-11 宿題 インデックスが大きい順にログ出力

以下の配列について、インデックスが大きい順にログ出力するスクリプトを作成してみましょう。
['Bob', 'Tom', 'Jay', 'Tom']

こういうこと?

画像6


演習3-12 二次元配列

function myFunction3_12({
 const numbers = [[10302040], [113121], [12]];  
 console.log(numbers[0][0]);
 console.log(numbers[0][1]);
 console.log(numbers[0][2]);
 console.log(numbers[0][3]);
 console.log(numbers[0]);
 console.log(numbers[1]);
 console.log(numbers[2]);
 console.log(numbers);
}

ログ出力の確認ですね。
配列が二重構造というか、 [ ]の中にさらに[ ]が入っているのがミソ。

演習3-13 ★宿題 二次元配列

以下の二次元配列を定数numbersに格納して、numbers[0][0],numbers[0][1],…,numbers[2][0]をそれぞれ出力するスクリプトを作成してみましょう。for文やfor...of文のネストを使ってみましょう。

これは割とすぐできた。と思ったらそうでもなかった。

愚直version、for文、for...of文の3種で考えてみた。

愚直versionは、問題なくすぐできた。そのまま素直に要素分の組み合わせを書いていく。これは数が少ないときには分かりやすく、メンテもしやすいので、これはこれでいいんじゃないかと思う。

for文version。二次元配列の取得、というのがこれで綺麗にできることに感激した。ネストになることで、一の位と十の位をそれぞれカウントをまわしていく。配列要素が大きいときにはガッと使えそう。

できた!と思って実行したら、おもったようなログにならなかった。

for文 間違い例 1

function myFunction3_13_02({
 const numbers = [[10302040], [113121], [12]];
 for (let i = 0; i < numbers.length; i++) {
   for (let j = 0; j < numbers.length; j++) {
     console.log(numbers[i][j]);
   }
 }
}

画像7


条件式が両方とも numbers.length になっているために間違っていると思う。numbers.length は一番外側の括弧内にいくつ要素があるかを返す、そのためこれではどちらも3になる。jのlengthはどうしたらスパッと表せる?

for...of文。これを理解するのに苦労した。入れ子構造なんだな。

例えば、const xxxとすると、最初のfor ofで xxxのyy 、さらに次のfor ofでyyのzとする構造になる。

文字だけだと何言ってるか全然わかんないよね、これ。

演習3-14 return

以下のように配列を引数として渡すと、その要素数を戻り値として返す関数lenArrayを作成してみましょう。
function myFunction3_14() {
 const members1 = ['Bob', 'Tom', 'Jay'];
 console.log(lenArray(members1)); //3
 
 const members2 = [['Bob', 'Tom', 'jay']];
 console.log(lenArray(members2)); //1
}

こういうこと?

画像9

う~~~~ん、こう、最初の引数から仮引数にぐわっときて、それが戻り値でもしゃっとされて、それがぽいっと戻される感じ。


あ~~~~難しいな~~~~~~。

いいなと思ったら応援しよう!

good-sun(a03)
いただいたサポートで、書籍代や勉強費用にしたり、美味しいもの食べたりします!