Section 1.14 配列

前回は曜日の表示をやったわけだけど、if を使っても switch を使ってもスクリプトは長くなっちゃったよね。
うん。でも6回比較しなくちゃいけないんだし、しょうがないんじゃない?
それが実はずっとシンプルに曜日を表示するスクリプトを書く方法があるんだ。
えっ、そうなの?
うん。配列を使うと、条件分岐を使わずに、曜日を表示するスクリプトが書けるんだ。
配列?
配列ってのは変数のグループって感じかな。
だから、配列を使うと『"日", "月", "火", "水", "木", "金", "土"』をひとまとめにして扱えるんだ。
こんな感じにね。

<配列の使用例>

var week = new Array();  // 配列を作ります
week[0] = "日";
week[1] = "月";
week[2] = "火";
week[3] = "水";
week[4] = "木";
week[5] = "金";
week[6] = "土";

配列の作り方って、Date クラスのときと似てるね。
うん。配列は Array クラスって言って、Date クラスと同じように オブジェクトを作ることで使えるようになるからね。
そっか、だから似てるんだね。
このスクリプトでは week って名前の配列を作ってて、 配列の中の最初の変数に "日"、次の変数に "月" っていうふうに代入してるんだ。
例えば week[0] は配列の中の最初の変数を表してて、 普通の変数と同じように値を代入したり参照したりできるよ。
最初の変数って week[1] じゃなくて week[0] なの?
そう。最初の変数が week[0]、その次の変数が week[1] ってなってるから間違えないように気をつけてね。
ちなみに、[] の中の値を添え字って呼ぶから覚えといてね。
うん、わかった。
あと、このスクリプトはもっと簡単にこう書くこともできるよ。

<配列の使用例(その2)>

var week = ["日""月""火""水""木""金""土"];

こんなふうに [] の間に『,』で区切って配列の要素を書いても OK。
配列の要素って?
配列の中に入ってる変数のことを要素って呼ぶんだ。
例えば、week[1] は1番目の要素、って感じにね。
あ、そうなんだ。
うん、確かにこれだと簡単に書けるね。
でしょ。
でもなんで配列を使うと前回のスクリプトが簡単に書けるの?
getDay メソッドで取得できる値ってどうなってるんだった?
え? えっと、日曜日が 0 で、月曜日が 1 で…
じゃあ、配列 week の中身は?
week[0]"日" で、week[1]"月" で…
あっ、getDay メソッドの値と添え字が同じになってる!
そ、だから getDay メソッドの値を添え字に使えば、曜日の文字列が取得できるってワケ。
そっかぁ、なるほどね〜。
じゃ、配列を使って今日の曜日を表示するスクリプトを書いてみて。
うん。

<曜日を表示するスクリプト(配列を使用)>

var d = new Date();
var week = ["日""月""火""水""木""金""土"];

System.inform("今日は" + week[d.getDay()] + "曜日です。");

こんな感じかな?
じゃ実行してみよ。
うん。

<実行結果>

表示されたメッセージ

あ、ちゃんと「今日は日曜日です。」って表示された!
うまくいったね。
うん!
確かに配列を使うと簡単に書けるね〜。
でしょ。
じゃ、あと配列でよく使うメソッドとプロパティを紹介しとくね。
プロパティ…って、確か前にも出てきたよね?
うん。§1.11 で文字列の length プロパティについてちょっと説明したよね。
配列には count っていうプロパティがあって、配列の要素数を取得したり設定したりできるんだ。
だから…

count プロパティの使用例(値の取得)>

var week = ["日""月""火""水""木""金""土"];

System.inform("配列 week には " + week.count + " 個の要素が含まれています。");

このスクリプトを実行すると…
配列 week には 7 個の要素が含まれています。」って表示されたね。
あと、こんなふうに count に値を代入すると、week に含まれる要素の数を変えられるよ。

count プロパティの使用例(値の設定)>

var week = ["日""月""火""水""木""金""土"];
week.count = 8;  // 配列の要素数を8個にします

System.inform("配列 week には " + week.count + " 個の要素が含まれています。");

ホントだ。今度は「配列 week には 8 個の要素が含まれています。」って表示されたね。
あ、これ最後の要素の値ってどうなってるの?
最後の要素にはまだ何も代入されてないから void になってるよ。
あ、そっか。代入する前の変数は中身が空だもんね。
ん、そう。
じゃ、次は add メソッド。
これは配列の最後に要素を追加するメソッドなんだ。

add メソッドの使用例>

var week = ["日""月""火""水""木""金"];
var pos = week.add("土");  // 配列の最後(0から数えて6番目)に "土" を追加します

System.inform("配列の " + pos + ' 番目に "' + week[pos] + '" が追加されました。');

配列の 6 番目に "土" が追加されました。」って表示されたね。
add メソッドは配列の最後に要素を追加して、追加した位置を添え字の番号で教えてくれるんだ。
ちなみに、こんなふうに値を受け取らなくても OK。

week.add("土");  // 値を受け取らなくても、配列の最後に要素が追加されます

あ、そうなんだ。
次は insert メソッド。
これは位置を指定して要素を追加するメソッド。

insert メソッドの使用例>

var week = ["日""月""火""木""金""土"];
week.insert(3, "水");  // (0から数えて)3番目に "水" を挿入します

System.inform('配列の 3 番目に "' + week[3] + '" が追加されました。');

うん、確かに「配列の 3 番目に "水" が追加されました。」って表示されたね。
"木""金""土""水" の後ろになるの?
うん。3番目以降にあった要素はひとつずつ後ろにずれるよ。
じゃあ、今度は逆に配列の中の要素を削除する erase メソッド。

erase メソッドの使用例>

var week = ["日""月""火""水""木""金""土"];
week.erase(3);  // (0から数えて)3番目の "水" を削除

System.inform('配列の 3 番目は "' + week[3] + '" になりました。');

"水" が削除されて "木" 以降がひとつずつ前にずれたから、 「配列の 3 番目は "木" になりました。」って表示されたんだね。
ん。あと、erase メソッドは、例えば 7 以上とかの範囲外の値を引数に指定すると例外が起こるから注意してね。
はーい。
じゃあ次は remove メソッド。
これも配列の中の要素を削除するんだけど、remove メソッドは要素の値を指定して削除するんだ。

remove メソッドの使用例>

var week = ["日""月""火""水""木""金""土"];
week.remove("水");  //  "水" という値を持つ要素を削除します

System.inform('配列の 3 番目は "' + week[3] + '" になりました。');

これもさっきと同じように "水" が削除されて "木" 以降がひとつずつ前にずれたから、 「配列の 3 番目は "木" になりました。」って表示されたんだよね。
ん、そう。
ちなみに、削除される値は === 演算子で比較して真になったものだけだから。
じゃあ、型も同じになってる要素だけが削除されるの?
そう。それと、remove メソッドには第2引数があって、true にすると同じ値をもつ全部の要素が削除されて、 false にすると同じ値を持つ最初の要素だけが削除されるんだ。

remove メソッドの使用例(その2)>

var numbers_true = [1, 2, 1, 4, 3];
var numbers_false = new Array();
numbers_false.assign(numbers_true);  // numbers_true の内容を numbers_false にコピーします

numbers_true.remove(1, true);    // 値が 1 になっている要素を全部削除します
numbers_false.remove(1, false);  // 値が 1 になっている最初の要素だけを削除します

System.inform("numbers_true には " + numbers_true.count + " 個の要素が含まれています。");
System.inform("numbers_false には " + numbers_false.count + " 個の要素が含まれています。");

assign っていうメソッドがあるけど、これってどんなメソッドなの?
assign メソッドは第1引数に指定した配列の内容をコピーするメソッドだよ。
だから numbers_truenumbers_false は同じ内容になるの。
あ、そうなんだ。
で、これを実行すると…
numbers_true には 3 個の要素が含まれています。」って表示されて、 「numbers_false には 4 個の要素が含まれています。」って表示されたね。
つまり、numbers_true の方は0番目と2番目の 1 が両方削除されたけど、 numbers_false の方は0番目の 1 だけが削除されたってこと。
じゃあ、numbers_true[2, 4, 3] になってて、 numbers_false[2, 1, 4, 3] になってるってこと?
うん、そういうこと。ちなみに第1引数を省略すると true だと見なされるよ。
じゃ次は clear メソッド。これは配列の中身を全部削除するんだ。

clear メソッドの使用例>

var week = ["日""月""火""水""木""金""土"];
week.clear();  // 配列の要素を全て削除します

System.inform("week には " + week.count + " 個の要素が含まれています。");

week には 0 個の要素が含まれています。」って表示されたね。
0 個ってことは、配列の中身が全部削除されちゃって空になってるってことだよね?
ん、そうだよ。
じゃあ、最後は find メソッド。
find ってことは、配列の中から何か見つけるの?
うん。find メソッドは、第1引数に指定した値と一致する最初の要素を探して、その添え字を教えてくれるんだ。
ちなみにこれも比較には === 演算子を使ってるよ。

find メソッドの使用例>

var week = ["日""月""火""水""木""金""土"];
var index = week.find("金");  // "金" という値を持つ要素を探します

System.inform('"金" は配列の ' + index + " 番目の要素です。");

"金" は配列の 5 番目の要素です。」って表示されたね。
あ、もし指定した値が見つからなかったらどうなるの?
その時は index-1 になるよ。
指定した値が見つかった時は 0 以上になるから、-1 だと見つかった場合と結果がかぶらないんだね。
ん、そゆこと。
あと、find メソッドには第2引数があって、検索開始位置を指定できるよ。
例えば、第2引数に 4 を指定すると "木""金""土" だけが検索対象になるんだ。
省略すると最初から検索するよ。
うん、わかった。
あと他にもメソッドがあるんだけど、その他のメソッドは TJS2 リファレンスの『Array クラス』の項目を参照してね。
ほんとだ、いっぱいあるね〜。
ま、ここで説明してないメソッドは、もし必要になったらその時説明するから。
はーい。
じゃ、今回はここまで。
また次回ね!


前へ | TOP | 次へ