概要
スプレッドシートから数字を受け取って、配列にバンバン足し込んでいきたい時、宣言した空の配列に足しても数字として扱われず計算されない。
最初から数値型で二次元配列を宣言したいな~って話。
ネタばれ
最初から数値型で宣言する方法が分からなかったので、要素すべてに「0」の入った二次元配列を作る形に着地^^;
割とスマートに記述できた(と思う)ので、メモがてら投稿。
※ちゃんとした方法があるのかもしれないけど、無教養なため今回の方法で解決(笑)
とりま力技ならこんな感じ?
function arrays() {
//5×3の要素すべてにゼロが入った配列
var arrays = [[0,0,0,0,0],
[0,0,0,0,0],
[0,0,0,0,0]];
//出来栄えを確認
Logger.log('\n', arrays, '\n');
//全ての要素に1を足してみる
for(var i=0; i<3; i++){
for(var j=0; j<5; j++){
arrays[i][j] += 1;
}
}
//数値型なので足し算OK!
Logger.log('\n', arrays);
}
要はこう言う事なんだけど、なんかカッコよくないし、要素数が多い時の記述が面倒臭そう。
成功例の前の失敗例
・空の配列作成 var array = Array(5);
・全ての要素にゼロ array.fill(0);
・別の配列にプッシュ arrays.push(array);
で行けんじゃね?と思って書いたのがコチラ。
function arrays() {
var arrays = [];
var array = Array(5).fill(0);
for(var k=0; k<3; k++){
arrays.push(array);
}
Logger.log('\n', arrays, '\n');
for(var i=0; i<3; i++){
for(var j=0; j<5; j++){
arrays[i][j] += 1;
}
}
Logger.log('\n', arrays);
}
出来上がりの見た目だけは良かったんだけど、全ての要素に1を足した時の挙動が変。なぜか全ての要素に3回ずつ足されてる???
同じ配列が3回並べて表示されてるだけのような・・・次元が歪んでる。
成功!
だったら、配列の宣言もfor文の中に入れて、繰り返しの度に再宣言させたらどうだろう。
function arrays() {
var arrays = [];
for(var k=0; k<3; k++){
var array = Array(5).fill(0);
arrays.push(array);
}
Logger.log('\n', arrays, '\n');
for(var i=0; i<3; i++){
for(var j=0; j<5; j++){
arrays[i][j] += 1;
}
}
Logger.log('\n', arrays);
}
まとめ
「x個」×「y個」の配列を持った数値型の二次元配列を宣言する、たったひとつの冴えたやりかたは・・・
var arrays = [];
for(var i=0; i<y; i++){
var array = Array(x).fill(0);
arrays.push(array);
}
たったひとつとも、冴えてるとも思わないけど、結構シンプルに仕上がったと思う(自画自賛)。