どうも。つじけ(tsujikenzo)です。このシリーズでは「2次元配列をオブジェクトに変換する」という内容で全6回でお送りします。いよいよ最終回で一区切りとなります。「メンテナンス不要でオブジェクトの生成をしたい」【後編】です。
前回までのおさらい
前回は、プロパティキーに変数を使い、2次元配列の先頭と以降の要素を1つずつ取り出してfor文で回すことでオブジェクトを生成しました。
今回は最終回として、処理を関数でパーツ化しながら、全体を構成したいと思います。
パーツ1 1つずつオブジェクト化
前回作成したのは、下記のようなコードです。
function myFunction() {
const VALUES = [[ 'id', 'name', 'age' ],[ 'tg001', '辻健蔵', 35 ],[ 'tg002', '江藤大', 37 ] ];
const HEADER = [...VALUES].shift();
const object = {};
for (const value of VALUES){
for(const [i, element] of HEADER.entries()){
object[HEADER[i]] = value[i];
}
console.log(object);
}
}
これを 「必要な値を引数として渡すと、オブジェクト化してくれるパーツ」 としてパーツ化する為に、いくつか事前準備をしましょう。
事前準備
- VALUESとHEADERはどこからでも呼び出せるようにグローバルエリアで定義する
- それに伴い、使用するfor (const value of VALUES){})は関数の外に出して、valueのみを引数として受け取るようにする。
- 名前はgetElementInfo_としてプライベート関数にする
以上を施したのがこちらです。
関数を作成した場合は、ドキュメンテーションコメントも必ず付けましょう。(e.gはfor exampleです。)
//グローバルエリア
const VALUES = [
['id','name','age'],
['tg001','辻健蔵',35],
['tg002','江藤大',37]
];
const HEADER = [...VALUES].shift();
/**
* 1要素をオブジェクト化してくれるパーツ
* @param {array} values e.g [‘tg001’,’kenzo’]
* @return {object} オブジェクト e.g{id:’tg001’, name:’kenzo’}
*/
function getElementInfo_(values) {
const object = {};
for(const [i, element] of HEADER.entries()){
object[HEADER[i]] = value[i];
}
return object
}
スッキリしましたね。
パーツ2 2つのタイプのオブジェクト変換
4日目でお伝えした通り、オブジェクト変換した後は[配列型] と[オブジェクト型]の2つの最終系があります。
配列型[{},{}]のオブジェクト変換
パーツ2(getElementInfo_())に引数(values)を渡しながら、オブジェクトを生成していきます。
名前はgetElementsArray_()とでもしましょうか。
/**
* オブジェクト群を配列で格納するパーツ
* @return {array} 配列 e.g[{id:’tg001’, name:’kenzo’},{},{}]
*/
function getElementsArray_() {
const elementsData = [];
for (const value of VALUES){
elementsData.push(getElementInfo_(value));
}
return elementsData;
}
オブジェクト型の{{},{}}のオブジェクト変換
同様にオブジェクト型です。名前はgetElementsObject_()とでもしましょうか。
/**
* オブジェクト群をオブジェクトで格納するパーツ
* @return {object} オブジェクト e.g{{id:’tg001’, name:’kenzo’},{},{}}
*/
function getElementsObject_() {
const elementsData = {};
for (const [i,value] of VALUES.entries()){
elementsData[VALUES[i][0]] = getElementInfo_(value);
}
return elementsData;
}
パーツ3 呼び出し
最後に呼び出し関数を用意しましょう。
function callObjectChanger(){
const elementsArray = getElementsArray_();
console.log(elementsArray);
const elementsObject = getElementsObject_();
console.log(elementsObject);
}
無事にオブジェクトが生成できていますでしょうか。
[20-11-24 15:29:14:521 JST] [ { id: 'id', name: 'name', age: 'age' },
{ id: 'tg001', name: '辻健蔵', age: 35 },
{ id: 'tg002', name: '江藤大', age: 37 } ]
[20-11-24 15:29:14:524 JST] { id: { id: 'id', name: 'name', age: 'age' },
tg001: { id: 'tg001', name: '辻健蔵', age: 35 },
tg002: { id: 'tg002', name: '江藤大', age: 37 } }
ちょっと感動です。
本日のまとめ
さて、長らくお待たせしました。コピペで使えるコードがこちらです。
//グローバルエリア
const VALUES = [
['id','name','age'],
['tg001','辻健蔵',35],
['tg002','江藤大',37]
];
const HEADER = [...VALUES].shift();
//呼び出し
function callObjectChanger(){
const elementsArray = getElementsArray_();
console.log(elementsArray);
const elementsObject = getElementsObject_();
console.log(elementsObject);
}
/**
* オブジェクト群を配列で格納するパーツ
* @return {array} 配列 e.g[{id:’tg001’, name:’kenzo’},{},{}]
*/
function getElementsArray_() {
const elementsData = [];
for (const value of VALUES){
elementsData.push(getElementInfo_(value));
}
return elementsData;
}
/**
* オブジェクト群をオブジェクトで格納するパーツ
* @return {object} オブジェクト e.g{{id:’tg001’, name:’kenzo’},{},{}}
*/
function getElementsObject_() {
const elementsData = {};
for (const [i,value] of VALUES.entries()){
elementsData[VALUES[i][0]] = getElementInfo_(value);
}
return elementsData;
}
/**
* 1要素をオブジェクト化してくれるパーツ
* @param {array} values e.g [‘tg001’,’kenzo’]
* @return {object} オブジェクト e.g{id:’tg001’, name:’kenzo’}
*/
function getElementInfo_(value) {
const object = {};
for(const [i, element] of HEADER.entries()){
object[HEADER[i]] = value[i];
}
return object
}
というわけで、全6回で2次元配列をオブジェクト化するをお送りしました。
が、実はこれで第1日目のまとめで書きました「今後やること」の1が終わっただけです💦
- 2次元配列→オブジェクト化って、まさか手作業じゃないですよね?
- オブジェクト化→処理って抽出(必要な列だけ、ある範囲の日時)とかできるんですか?
- 処理→再2次元配列ってごにょごにょしてましたよね。さっき。
- idが無い時ってどうすれば?というか元に戻した時に最初の状態に順番ちゃんと戻るの?
- 「テーブル」とか「主キー」とか「レコード」とか説明無しに出てきたから途中で読むのを止めた方!大変申し訳なかたったでのデータベースの基礎勉強してみましょう!
- あれ?これってJSONじゃないの・・・?
- そもそもオブジェクトってなに?
しかしながら、便利なパーツが書けた気がしますので、今後は実践で活用しながら連載をお届けできればなと思います。
配列型のオブジェクトは.filter()メソッドでバチっと目的の要素が抽出できたりします。
ユニークキーがありますので、別のテーブルから取ってきたキーを参照してリレーショナルデータベースを実現できそうです。
一方で「AppSheetでいいんじゃない?」「何万件もレコードがあるからGCPに行かないと重たいよ。」なんて声も聞こえてきますね。
果たしてどんなソリューションが見いだせるか楽しみです。
そして、次回シリーズが決定しました。
次回は、「こいつをライブラリ化しよう」をお送りいたします。お楽しみに~。
[追伸]
このシリーズを執筆するにあたりノンプロ研のetau0422さんに大変お世話になりました。
私のGAS師匠でございます。心より感謝申し上げます。控え目に言って天才ですw
このシリーズの目次
[GAS]2次元配列をオブジェクトに変換する‐1日目‐
[GAS]オブジェクトリテラルと仲良くなろう【前編】‐2日目‐
[GAS]オブジェクトリテラルと仲良くなろう【中編】‐3日目‐
[GAS]オブジェクトリテラルと仲良くなろう【後編】‐4日目‐
[GAS]2次元配列をオブジェクト化[最終系] 【前編】‐5日目‐
[GAS]2次元配列をオブジェクト化[最終系] 【後編】‐6日目‐