JavaScriptのcollection操作

今回は、JavaScriptのcollectionを用いたデータの操作をご紹介したいと思います。

紹介するコレクション操作のメソッド

forEach()
整形したデータをレコードに出力するときなどに使うと便利です。使い方はこちら

map()
配列の各要素を一定の処理で変更したいときに使うと便利です。サンプルでは、元データに郵便番号を足したデータを作成する際に使用しています。
使い方はこちら

filter()
条件を満たす要素のみを残した配列を作りたいときに使うと便利です。サンプルでは、表2用のデータを選別する際に使用しています。使い方はこちら

reduce()
オリジナルのSUM関数などを容易に作れます。使い方はこちら

サンプル

やること

1.名簿を取得し、その「住所」に対応する「郵便番号」の情報を足して表示する。これを表1とする。

2.表1の内、「郵便番号」が「00」から始まるデータを取り除いたリストを表示する。これを表2とする。

3.表1、表2それぞれについて体重の合計値を出す。

用意されているデータ

1.「氏名、住所、体重」をから成る名簿

2.郵便番号住所対応表

作成したJavaScriptコード

※kintone APIではフィールドコードを使用します。このサンプルでの各フィールドのフィールドコードは、「やること」の画像で示したフィールド名と一致させています。表1、表2のフィールドコードは「Table」、「filteredTable」としています。

(function() {
"use strict";
var events = [
'app.record.edit.submit',
'app.record.create.submit',
];
kintone.events.on(events, function (event) {
return new kintone.Promise(function(resolve, reject) {
(async function(){
var record = event.record;
//ルックアップで取得したデータを配列にまとめる。
var original = [];
record.Table.value.forEach(function(element){
original.push({name:element.value.氏名.value, adress:element.value.住所.value, weight:element.value.体重.value});
});
//住所に対応する郵便番号を足した配列を作成する。
var mapped = await Promise.all(original.map(async element => {
return await add_zipcode(element);
}));
//表1の郵便番号のレコードを書き込む。
mapped.forEach(function(element, index){
record['Table']['value'][index]['value']['郵便番号']['value'] = element.zipcode;
});
//郵便番号が00から始まるデータを取り除いた配列を作成する。
var filtered = mapped.filter(function(element){return !element.zipcode.startsWith("00");});
//表2のレコードを書き込む。
filtered.forEach(function(element, index){
if(!index){
record['filteredTable']['value'][index]['value']['氏名2']['value'] = element.name;
record['filteredTable']['value'][index]['value']['住所2']['value'] = element.adress;
record['filteredTable']['value'][index]['value']['郵便番号2']['value'] = element.zipcode;
record['filteredTable']['value'][index]['value']['体重2']['value'] = element.weight;
}else{
var newRow = {
value: {
氏名2: {
type: 'SINGLE_LINE_TEXT',
value: element.name
},
住所2: {
type: 'SINGLE_LINE_TEXT',
value: element.adress
},
郵便番号2: {
type: 'SINGLE_LINE_TEXT',
value: element.zipcode
},
体重2: {
type: 'NUMBER',
value: element.weight
}
}
};
record['filteredTable']['value'].push(newRow);
}
});
//表1,表2それぞれの体重の合計を求める。
record['表1_体重合計']['value'] = sum_weight(mapped);
record['表2_体重合計']['value'] = sum_weight(filtered);
resolve(event);
})();
});
});
function add_zipcode(element){
return new kintone.Promise((resolve, reject) => {
var adress_split = element.adress.split(" ");
adress_split.pop();
var adress = adress_split.join(" ");
var query = '住所 = "' + adress + '"';
var appId = 7025;
var params = {
'app': appId,
'query': query,
};
kintone.api(kintone.api.url('/k/v1/records'), 'GET', params, function(resp) {
resolve(Object.assign({}, element, {zipcode: resp.records[0].郵便番号.value}));
});
});
}
function sum_weight(a){
return a.reduce(function(x, y){return Number(x) + Number(y.weight);},0);
}
})();