プログラミングでは、変数の値を入れ替える処理がありますよね。
(例)x = 1, y = 3 → x = 3, y = 1
たとえば、ソートアルゴリズムの一種である「バブルソート」では、この入れ替え処理を使います。
変数 x と y の値を入れ替える処理を考えてみましょう。x の値を y に、y の値を x に入替(交換)します。
昔の私が書いたコードがこちら。
昔のもり
x と y の値を入れ替えるだけでしょ!余裕のよっちゃんだよ!
1 2 3 4 5 6 7 8 9 10 11 12 |
function shuffle() { var x = 1; var y = 3; x = y; y = x; Logger.log(x); // 3 Logger.log(y); // 3 } |
初心者なら一度は書いたことがあるのではないでしょうか(私だけ・・・?)
昔のもり
あれ?入れ替わってないぞ、おかしいな
モリ
・・・(笑)
スポンサーリンク
【定番】一時変数を使用して値を入れ替える
よく見かけるのは、入れ替え対象の変数x, y 以外に、もう一つ別の変数(一時変数)を用意して、値を入れ替える方法です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
function shuffle1() { var x = 1; var y = 3; tmp = x; x = y; y = tmp; Logger.log(x); // 3 Logger.log(y); // 1 } |
なんと、分割代入というワザを使うことで、一時変数を使わずに直接xとyの入れ替えができるんですよ!
(ドットインストールのJavaScript講座で発見した驚きのワザです)
分割代入とは
「分割代入」とは、配列の値・オブジェクトのプロパティを、個別の変数に一括で代入する方法です。
簡単な例を紹介します。配列変数arrの各要素を、変数 x, y, z に一括で代入できます。
1 2 3 4 5 6 7 8 9 |
function myFunction() { var arr = [1, 3, 5]; var [x, y, z] = arr; // 1, 3, 5 Logger.log('%s, %s, %s',x, y, z); } |
オブジェクトのプロパティを、個別変数に一括代入することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
function myFunction2() { var obj = { id : 'A001', age : 25, name : 'Bob' }; var {id:x, age:y, name:z} = obj; //A001, 25, Bob Logger.log('%s, %s, %s',x, y, z); } |
分割代入で値を入れ替える
さて、ここからが本題!
分割代入を用いて、変数 x と y の値を入れ替えるコードがこちら。
1 2 3 4 5 6 7 8 9 10 11 |
function shuffle2() { var x = 1; var y = 3; [x, y] = [y, x]; Logger.log(x); // 3 Logger.log(y); // 1 } |
たったの一行で入れ替えができる、すばらしきこの記述!
[x, y] = [y, x]
もり
おぉ、まるで反則級の便利さ・・・
※反則ではありません
配列の要素の入れ替えもできます。
1 2 3 4 5 6 7 8 9 |
function shuffle3() { var arr = [1, 3]; [arr[0], arr[1]] = [arr[1], arr[0]]; Logger.log(arr);// [3, 1] } |
GASでバブルソート
この分割代入を用いて、バブルソートを書いてみました。
14行目で配列の要素の入れ替えをしています。たったの1行で書けるのでスッキリですね。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//バブルソートで小さい順に並び替える function shuffle4() { var arr = [5, 3, 1, 4, 2]; var cnt = arr.length - 1;//ソート範囲 while (cnt > 0) { for(var i = 0; i < cnt; i++) { var j = i + 1;//右の要素と比較 if(arr[i] > arr[j]) { [arr[i], arr[j]] = [arr[j], arr[i]]; } } cnt--; } Logger.log(arr);// [1, 2, 3, 4, 5] } |
もり
すっごい便利だから、みんなも是非使ってみてね~
スポンサーリンク
スポンサーリンク