linq-es5の使い方

http://confrage.jp

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":"佐藤トミー"}

コメント

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