LANG SELRCT

コードを書く場所についてはこちら

2018年2月12日月曜日

JavaScriptで配列をコピーする(シャローコピー)


.slice(0)で配列をコピーするコードの例です

slice(0)で0番目の要素から最後の要素までを取り出す方法で書いています


以下の2つでも同じです
  • array.slice()
  • array.slice(0, array.length)



コード.gs
function get_copy(){
  var array = [1, 2, 3, 4, 5];
  var copy_array = array.slice(0);
  array[0] = 0;
  Logger.log([array, copy_array]);
}
意訳
この機能がやること
配列を用意して
arrayの0番目から最後まで取り出して(つまりarrayと同じ配列になる)
確認のためarrayの順番をちょっと変えて(先頭の要素に0を入れる)
ログに出す




実行結果
array, copy_arrayの順でログに出る

arrayは
先頭の要素を0にした配列
[0.0, 2.0, 3.0, 4.0, 5.0]


copy_arrayは
先頭の要素を変更する前の配列
[1.0, 2.0, 3.0, 4.0, 5.0]




補足


この方法でコピーされるのは1階層だけのようです(=シャローコピー)

2階層(2次元配列とか)以上の要素の値を変更すると、コピー元共々変更される

どういうことかやってみる


1次元配列でやってみると

コード.gs
function one_dimention(){
 var array = ["HARE"];
 var array_slice = array.slice();
 array_slice.push("AME");
 array.push("YUKI");

 Logger.log(array);
 Logger.log(array_slice);
}

意訳
この機能がやること
配列を用意して
sliceでコピーして
要素を追加する
コピー元の配列にも要素を追加する

コピー元の配列をログに出す
コピーした配列をログに出す




実行結果
コピーした配列とコピー元の配列で中身はそれぞれ異なる


2次元配列でやってみると

コード.gs
function two_dimentions(){
 var array = [["HARE"]];
 var array_slice = array.slice();
 array_slice.push("AME");
 array_slice[0].push("KUMORI");
 array.push("YUKI");
 array[0].push("MIZORE");
  
 Logger.log(array);
 Logger.log(array_slice);
}
意訳
この機能がやること
2次元配列を用意して
sliceでコピーして
配列に要素を追加する
配列の0番目の要素に要素を追加する
コピー元の配列に要素を追加する
コピー元の配列の0番目の要素に要素を追加する

コピー元の配列をログに出す
コピーした配列をログに出す



実行結果
コピーした配列とコピー元の配列で0番目は同一になる