linq-es5の使い方
こんにちは東です。
今回はlinq-es5の使い方について書いてみようと思います。
各メソッドの使用方法をぞれぞれ記載していきます。
何をしたい時にどのメソッドをどのように利用すればよいか、
実際のソースで記載していきます。
今回は以下の処理を掲載しています。
- 単一条件を指定したデータのフィルタリング(Where)
- 複数条件を指定したデータのフィルタリング
- グループ化によるカウント(GroupBy)
- 結合によるデータ取得(Join)
package.jsonのdependenciesには以下の内容を設定しています。
"dependencies": {
"linq-es5":"1.11.13"
,"jsdoc":"3.5.5"
}
データ
- testdata.json
[
{
"id":1
,"name":"山田太郎"
,"tell":"08000000001"
,"address":"大阪府大阪市"
}
,{
"id":2
,"name":"山田次郎"
,"tell":"08000000002"
,"address":"大阪府大阪市"
}
,{
"id":3
,"name":"山田三郎"
,"tell":"08000000003"
,"address":"大阪府大阪市"
}
,{
"id":4
,"name":"山田四郎"
,"tell":"08000000004"
,"address":"大阪府大阪市"
}
,{
"id":5
,"name":"鈴木一郎"
,"tell":"08010000001"
,"address":"大阪府寝屋川市"
}
,{
"id":6
,"name":"佐藤次郎"
,"tell":"08020000001"
,"address":"大阪府門真市"
}
]
- joindata.json
[
{
"parentid":1
,"id":1
,"supporter":"山田花子"
}
,{
"parentid":1
,"id":2
,"supporter":"山田桃子"
}
,{
"parentid":1
,"id":3
,"supporter":"山田小次郎"
}
,{
"parentid":1
,"id":4
,"supporter":"山田小太郎"
}
,{
"parentid":1
,"id":5
,"supporter":"山田ジョージ"
}
,{
"parentid":6
,"id":6
,"supporter":"佐藤ケビン"
}
,{
"parentid":6
,"id":7
,"supporter":"佐藤トミー"
}
,{
"parentid":7
,"id":8
,"supporter":"佐藤シロウ"
}
]
ソース
var fs = require('fs');
var Enumerable = require('linq-es5');
var path = __dirname + '/resources/';
const testdata = JSON.parse(fs.readFileSync(path + 'testdata.json', 'utf8'));
const supporterdata = JSON.parse(fs.readFileSync(path + 'joindata.json', 'utf8'));
/**
* 単純なWhere句
*/
var whereCount = Enumerable.asEnumerable(testdata)
.Where(a => a.address == '大阪府寝屋川市')
.Count();
console.log("Where句の結果: " + whereCount + "\r\n");
// 実行結果
// Where句の結果: 1
/**
* SQLで言う所のANDを利用する場合
*/
var whereWithAndArray = Enumerable.asEnumerable(testdata)
// addressが大阪府 かつ 名前が山田太郎のデータのみ抽出します
.Where(a => a.address.match('大阪府') && a.name == '山田太郎')
.ToArray(); // // 結果をIterableから配列にして返す
console.log("AND 件数: " + whereWithAndArray.length + "\r\n");
console.log("AND 内容: " + whereWithAndArray[0].name + "\r\n");
// 実行結果
// AND 件数: 1
// AND 内容: 山田太郎
/**
* GroupByを利用したパターン
*/
console.log('GroupByの結果: \r\n');
var groupbyResults = Enumerable
.asEnumerable(testdata)
// GroupByで、何をキーにGroupingするのかを指定します。
.GroupBy(
a => a.address, // キーセレクタ
a => a.address, // elementセレクタ
// addressが何件あったのかを表示します。key:address g.length:件数
(key, g) => {
return {Address:key, Count:g.length} // 返却するObjectの定義
})
.ToArray(); // 結果をIterableから配列にして返す
console.log(JSON.stringify(groupbyResults));
// 実行結果
// [
// {"Address":"大阪府大阪市","Count":4},
// {"Address":"大阪府寝屋川市","Count":1},
// {"Address":"大阪府門真市","Count":1}
// ]
/**
* Joinを行うパターン
* Parentに紐付くChildを、id,parentidで紐付けて
* それぞれの名前を取得しています。
*/
class Child {
constructor(o) {
this.parentid = o.parentid;
this.id = o.id;
this.supporter = o.supporter;
}
}
class Parent {
constructor(o) {
this.id = o.id;
this.name = o.name;
this.tell = o.tell;
this.address = o.address;
}
}
var parentArray = [];
var childArray = [];
for (var obj of testdata) {
parentArray.push(new Parent(obj))
}
for (var obj of supporterdata) {
childArray.push(new Child(obj))
}
console.log('Joinの結果: \r\n');
var parents = Enumerable.asEnumerable(parentArray);
var childs = Enumerable.asEnumerable(childArray);
var query =
parents.Join(childs,
parent => parent.id, // 親のid
child => child.parentid, // 子が持つ親のid
(parent, child) => {
// 返却するObjectの定義
return { ParentName: parent.name, SupportName: child.supporter };
});
// 取得結果を表示
for (var obj of query) {
console.log(JSON.stringify(obj));
}
// 実行結果
// {"ParentName":"山田太郎","SupportName":"山田花子"}
// {"ParentName":"山田太郎","SupportName":"山田桃子"}
// {"ParentName":"山田太郎","SupportName":"山田小次郎"}
// {"ParentName":"山田太郎","SupportName":"山田小太郎"}
// {"ParentName":"山田太郎","SupportName":"山田ジョージ"}
// {"ParentName":"佐藤次郎","SupportName":"佐藤ケビン"}
// {"ParentName":"佐藤次郎","SupportName":"佐藤トミー"}
/**
* GroupJoinを行うパターン
* Parentに紐付くChildを、Parentに内包して返却します。
*/
console.log('GroupJoinの結果: \r\n');
var parents = Enumerable.asEnumerable(parentArray);
var childs = Enumerable.asEnumerable(childArray);
var groupQuery =
parents.GroupJoin(childs,
parent => parent.id, // 親のid
child => child.parentid, // 子が持つ親のid
(parent, childCollection) => {
// 返却するObjectの定義
return { ParentName: parent.name,
// 以下のようにSelectを利用することで、取得する内容を指定できます。
// 今回は、childそのものをSupportsに追加しています。
Supports: Enumerable.asEnumerable(childCollection)
.Select(child => child)};
});
// 取得結果を表示
for (var obj of groupQuery) {
console.log(JSON.stringify(obj));
for (var obj of obj.Supports) {
console.log(" " + JSON.stringify(obj));
}
}
// 実行結果:
// {"ParentName":"山田太郎","Supports":{"_target":{"_target":[{"parentid":1,"id":1,"supporter":"山田花子"},{"parentid":1,"id":2,"supporter":"山田桃子"},{"parentid":1,"id":3,"supporter":"山田小次郎"},{"parentid":1,"id":4,"supporter":"山田小太郎"},{"parentid":1,"id":5,"supporter":"山田ジョージ"}]}}}
// {"parentid":1,"id":1,"supporter":"山田花子"}
// {"parentid":1,"id":2,"supporter":"山田桃子"}
// {"parentid":1,"id":3,"supporter":"山田小次郎"}
// {"parentid":1,"id":4,"supporter":"山田小太郎"}
// {"parentid":1,"id":5,"supporter":"山田ジョージ"}
//
// 以下のように、子要素がなかったデータも抽出されます。
// {"ParentName":"山田次郎","Supports":{"_target":{"_target":null}}}
// {"ParentName":"山田三郎","Supports":{"_target":{"_target":null}}}
// {"ParentName":"山田四郎","Supports":{"_target":{"_target":null}}}
// {"ParentName":"鈴木一郎","Supports":{"_target":{"_target":null}}}
// {"ParentName":"佐藤次郎","Supports":{"_target":{"_target":[{"parentid":6,"id":6,"supporter":"佐藤ケビン"},{"parentid":6,"id":7,"supporter":"佐藤トミー"}]}}}
// {"parentid":6,"id":6,"supporter":"佐藤ケビン"}
// {"parentid":6,"id":7,"supporter":"佐藤トミー"}
元々Javaエンジニアからはじまり、気付けばJS(ES6)、AWS、Python3.6、OutsystemsPlatform、PHPと色々やってました。
得意技: Java、JS(ES6)、AWSの一部リソース
勉強中: AWSの各種リソースと、Python3.6
MarkDownからASCiiDocへ目覚めつつある今日この頃。
座右の銘は「一言芳恩」「華麗奔放」「不決断こそ最大の害悪である」です。
コメント