【GAS】配列の各要素に対してループ処理(反復処理)を実行する(for / while / forEach / map)
この記事では、配列の各要素に対してループ処理(反復処理)を実行する方法をご紹介します。
配列の各要素に対してループ処理を実行するには、GAS(その元となるjavascript)に備わっているループ処理構文(for / while)と、配列のメンバーとしてループ機能がある反復メソッド(forEach / map)があります。それぞれの構文と使い方を解説します。
for文
多くの言語でもなじみ深く、使用方法がわかりやすいのがfor文によるループ処理です。
for(初期化条件; 条件式; 増減式) {
// 条件式がtrurの間に実行される処理
}
GASではスプレッドシートを読み込み、配列としてfor文を回すことも多いですが、配列に繰り返し処理を実行する場合、条件で置いた変数をインデックスとして用いて各要素を呼び出すことが多いと思います。
let animals = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
for (let i = 0; i < animal.length; i++){
animal[i] = animal[i] + 's';
}
console.log(animal);//[ 'cats', 'dogs', 'elephants', 'tigers', 'lions', 'monkeys' ]
配列と一緒に使うとループ処理が格段に便利になるfor文がfor inとfor of です。
配列や文字列など、反復可能なオブジェクトに含まれるすべての要素に対して繰り返し処理を実行します。for文との違いとして、すべての要素に処理を実行するので条件式や増減式は不要です。
for of 文
for(変数 of 反復可能オブジェクト){
//ループ内で実行する処理
}
for of文は、反復可能オブジェクトに含まれる要素を定められた順番通りに取り出しで反復処理を実行します。
let animals = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
for (let animal of animals){
console.log('index of',animal, ':' ,animals.indexOf(animal));
}
18:24:10 情報 index 0 : cat
18:24:10 情報 index 1 : dog
18:24:10 情報 index 2 : elephant
18:24:10 情報 index 3 : tiger
18:24:10 情報 index 4 : lion
18:24:10 情報 index 5 : monkey
for in
for(変数 in 反復可能オブジェクト){
//ループ内で実行する処理
}
for in文は、反復可能オブジェクトに含まれるプロパティを順不同で取り出し、変数に格納してから反復処理を実行します。変数として取り出すのが要素ではなくプロパティ自身であること、順序が保証されていないことがfor of 文との大きな違いです。
let animals = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
for (let index in animals){
console.log('index ', index, ':', animals[index]);
}
18:20:00 情報 index of cat : 0
18:20:00 情報 index of dog : 1
18:20:00 情報 index of elephant : 2
18:20:00 情報 index of tiger : 3
18:20:00 情報 index of lion : 4
18:20:00 情報 index of monkey : 5
while文
for文は処理回数が決められていましたが、処理するものがあれば実行し続けてくれるのがwhile文です。処理実行前に条件を確認してtrueであれば処理を実行し続けます。
while( 条件式 ){
//条件式がtrueの間に実行される処理
}
let i = 0;
while(i > 5){
console.log(i);
i++;
}
1:54:45 情報 0
1:54:45 情報 1
1:54:45 情報 2
1:54:45 情報 3
1:54:45 情報 4
1:54:45 情報 5
do while
while文とは条件判定のタイミングが異なり、while文が処理実行前に判定するのに対してdo while文は処理後に判定します。while文は条件によっては一度も実行されない可能性がありますが、do while文は最低一度は実行される点で異なります。
do{
//条件式がtrueの間実行される処理
} while(条件式)
let i = 0;
do{
console.log(i);
i++;
} while(i > 5)
18:39:34 情報 0
forEachメソッド
配列の各要素に対して関数を実行するメソッドです。
Array.forEach(fnc)
- fnc(必須):配列のすべての要素に逐次適応される関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:関数の実行結果
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//各要素をログする関数
function logAnimal(value) {
console.log(value);
}
animal.forEach(logAnimal);
5:45:42 情報 cat
5:45:42 情報 dog
5:45:42 情報 elephant
5:45:42 情報 tiger
5:45:42 情報 lion
5:45:42 情報 monkey
mapメソッド
Array.map(fnc)
- fnc(必須):配列のすべての要素に逐次適応される関数
・value(必須):配列の各要素
・index(任意):各要素のインデックス
・array(任意):メソッドが呼び出された時の元の配列 - 戻り値:関数の実行結果を要素とした配列
let animal = ['cat', 'dog', 'elephant', 'tiger', 'lion', 'monkey'];
//各要素の先頭に'a 'を加える関数
function logAnimal(value) {
return 'a ' + value;
}
console.log(animal.map(logAnimal));//[ 'a cat', 'a dog', 'a elephant', 'a tiger', 'a lion', 'a monkey' ]
forEachメソッドと同じような印象を持ちがちですが、各要素に対して関数の処理を実行するforEachメソッドに対して、mapメソッドは処理結果を新たな要素として配列に返すということなので結果が全然異なります。
まとめ
GASにおいて、配列の各要素に対してループ処理を実行する手法(for文 / while文 / forEach / map)をご紹介しました。