できますよ、typoに気をつけてください
javascript
1function mnyFunction() {
2//テストのため1をあらかじめ設定
3var i=1;
4
5var array_data1 = makeit(i)
6
7//array_data1という配列が戻ってきてほしい
8array_data1.push(1)
9
10//makeit()で止まるのでログには何も表示されません
11Logger.log(array_data1); //[1.0 , 1.0]
12
13}
14
15function makeit(i){
16
17eval("var array_data"+ i +" = []");
18
19//array_data1が見つかりませんとエラーが出ます
20array_data1.push(1)
21
22return array_data1
23}
コードとコードから推測したやりたいことからすると、こういうやりかたがいいのではないでしょうかという提案を。
functionによって変数のスコープが決まるので、makeit側でarray_data1とかって名前をつけても無意味。結局は、makeitの呼び出し側・array_data1の利用側で、変数iを使って変数array_data1を指せる必要がある。
→呼び出し側でevalするか、呼び出し側のthisを渡すか、の手当が必要になってくる。
かといって、1個じゃないから悩んでいるはずで、呼び出し側で、evalはできないと想像する
質問コードのmyFunctionでarray_data1と書いているけれど、("array_data"+i).push(some)
みたいな使い方はどうやったってできないのだから、質問が解決できても無意味なんじゃないでしょうか。あらかじめコードで変数名を指定できるってことは個数が分かっているということでしょう?動的に増やす意味がない。
そりゃeval("tmp = array_data"+i+"[1]");
とかやればできなくはないのでしょうが、全部のコードをevalで進行していくのはつらいのではないでしょうか。コードに色がつかないからtypoにも気付けない。
利用側で変数を使って変数にアクセスできる、というのはobjectで解決できるし、外で任意の個数作らせるということも考えると、やりたいインデクサでアクセスできるobjectをもらったほうがいいのではないだろうか、と考えました。
このパターンなら、下記を後からobjectにarray_data5を足すことを想定したコードに書きかえるのは難しくないと思います。
ただ、こうやってくると、最初から、array_data[i][j]で良くないですか、って話になって、それが最初の追記
javascript
1function trialGiveMeArrays() {
2 const dataSet = giveMeArrays(4);
3 const two = 2;
4 dataSet["array_data"+two].push(3);
5 Logger.log(dataSet);
6 Logger.log(dataSet["array_data"+two]);
7}
8function giveMeArrays(nanko) {
9 const keys = [];
10 for(i = 1; i <= nanko; i++) {keys.push("array_data"+i);}
11 return keys.reduce(function(prev,curr){ prev[curr] = [0];return prev;}, {});
12}
-- 将来ご覧になる方へ
特定の用途、要件があってやむなくこうしようとしているものと思われます。
配列が増やしたいなら、端的に2次元配列を作ればよいと思うので、一般論としては参考にしないでください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/31 04:16
2018/11/01 04:41 編集