[GAS]2次元配列をオブジェクト化[最終系] 【後編】‐6日目‐

GAS

どうも。つじけ(tsujikenzo)です。このシリーズでは「2次元配列をオブジェクトに変換する」という内容で全6回でお送りします。いよいよ最終回で一区切りとなります。「メンテナンス不要でオブジェクトの生成をしたい」【後編】です。

前回までのおさらい

前回は、プロパティキーに変数を使い、2次元配列の先頭と以降の要素を1つずつ取り出してfor文で回すことでオブジェクトを生成しました。

[GAS]2次元配列をオブジェクト化[最終系] 【前編】‐5日目‐
どうも。つじけ(tsujikenzo)です。このシリーズでは「2次元配列をオブジェクトに変換する」という内容で全6回でお送りします。今日は第5回目です。今回から、「基礎とかいいから最終的にコピペで使えるコードを教えてよ」という声にお答え...

今回は最終回として、処理を関数でパーツ化しながら、全体を構成したいと思います。

パーツ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つの最終系があります。

[GAS]オブジェクトリテラルと仲良くなろう【後編】‐4日目‐
どうも。つじけ(tsujikenzo)です。このシリーズでは「2次元配列をオブジェクトに変換する」という内容で全6回でお送りします。今日は第4回目です。今日はオブジェクトリテラルの基礎・後編です。オブジェクトリテラルについては最後なので頑張...

配列型[{},{}]のオブジェクト変換

パーツ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が終わっただけです💦

  1. 2次元配列→オブジェクト化って、まさか手作業じゃないですよね?
  2. オブジェクト化→処理って抽出(必要な列だけ、ある範囲の日時)とかできるんですか?
  3. 処理→再2次元配列ってごにょごにょしてましたよね。さっき。
  4. idが無い時ってどうすれば?というか元に戻した時に最初の状態に順番ちゃんと戻るの?
  5. 「テーブル」とか「主キー」とか「レコード」とか説明無しに出てきたから途中で読むのを止めた方!大変申し訳なかたったでのデータベースの基礎勉強してみましょう!
  6. あれ?これってJSONじゃないの・・・?
  7. そもそもオブジェクトってなに?

しかしながら、便利なパーツが書けた気がしますので、今後は実践で活用しながら連載をお届けできればなと思います。

配列型のオブジェクトは.filter()メソッドでバチっと目的の要素が抽出できたりします。

ユニークキーがありますので、別のテーブルから取ってきたキーを参照してリレーショナルデータベースを実現できそうです。

一方で「AppSheetでいいんじゃない?」「何万件もレコードがあるからGCPに行かないと重たいよ。」なんて声も聞こえてきますね。

果たしてどんなソリューションが見いだせるか楽しみです。

そして、次回シリーズが決定しました。

次回は、「こいつをライブラリ化しよう」をお送りいたします。お楽しみに~。

[追伸]

このシリーズを執筆するにあたりノンプロ研のetau0422さんに大変お世話になりました。

私のGAS師匠でございます。心より感謝申し上げます。控え目に言って天才ですw

このシリーズの目次

[GAS]2次元配列をオブジェクトに変換する‐1日目‐
[GAS]オブジェクトリテラルと仲良くなろう【前編】‐2日目‐
[GAS]オブジェクトリテラルと仲良くなろう【中編】‐3日目‐
[GAS]オブジェクトリテラルと仲良くなろう【後編】‐4日目‐
[GAS]2次元配列をオブジェクト化[最終系] 【前編】‐5日目‐
[GAS]2次元配列をオブジェクト化[最終系] 【後編】‐6日目‐

タイトルとURLをコピーしました