前提
GAS
1 const obj = {}; 2 const data = new Map([ 3 ['event.AAA.B','テスト1'], 4 ['event','テスト2'], 5 ['id','テスト3'], 6 ['data.3.B.a','テスト4'] 7 ]);
というデータがあったときに、
GAS
1 obj['event']['AAA']['B'] = 'テスト1'; 2 obj['event'] = 'テスト2'; 3 obj['id'] = 'テスト3'; 4 obj['data']['3']['B']['a'] = 'テスト4'; 5 6// Logger.log(obj); 7// {event=テスト2, id=テスト3}
となるようにデータ格納したいです。
実現したいこと
1.配列内のkeyを.で分割し、それをobjの配列のkeyにしたいです
(key側についている.の前後の値も数も変化します)
2..がない場合、objにそのまま格納
該当のソースコード
GAS
1function myFunction() { 2 const obj = {}; 3 const data = new Map([ 4 ['event.AAA.B','テスト1'], 5 ['event','テスト2'], 6 ['id','テスト3'], 7 ['data.3.B.a','テスト4'] 8 ]); 9 10 data.forEach((item, index) => { 11 var arr = index.split("."); 12 13 // 分割数を確認 14 var arr_size = arr.length; 15 16 // 1個しかない為、そのまま 17 if(arr_size == 1){ 18 obj[index] = item; 19 }else{ 20 var val_count = 0; 21 22 arr.forEach(function(key){ 23 val_count += 1; 24 // 最後の値 25 if(val_count == arr_size){ 26 // 最後の値が取得出来ている 27 // Logger.log(key); 28 } 29 }); 30 31 // Logger.log(obj); 32 // {event=テスト2, id=テスト3} 33 } 34 }); 35} 36
エラーメッセージ
ただ単にそのまま格納しようとした際に
obj['event']['AAA']['B'] = 'テスト1';
を実行しようとすると当然ですが、eventが無かったりAAAが存在しないということで
TypeError: Cannot read property 'AAA' of undefined
を吐いてしまう為、この辺りをどうやってクリアするかが思いつきませんでした。
試したこと
1.MAP内のkeyの値を.で分割まで完了しました
2..が無い場合、そのままobjに格納するまで完了しました
3.最後のピリオドだった場合の分岐を作成しました
動的にオブジェクトを作成するのが難しく
詳しい方いらっしゃったらよろしくお願いいたします。
アドバイスだけでも本当に助かります。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/08/13 06:16