[Node.js]Node.jsでLINQしてみる。

npm linqパッケージの使用。
LINQ坊なので、Node.js内でLINQ(Language Integrated Query)を使用してみたいと思います。

linq – linq.js – LINQ for JavaScript library packaged for node.js
https://github.com/mihaifm/linq
これってneue.ccさんのlinq.jsをNode.js用に移植したものだったんですねー。

ということで、linqのtutorial.jsを眺めていてもなとなくわかるのですが、本家linq.jsをダウンロードして、reference.htmを実行してみると色々サンプルが載っているので参考にしてみてください。

とりあえず、個人的によく使う、Select,Where,Take,Skip,Any,Countについてのみ。
前回のエントリーで使用したRSSフィードをJSON化したものに対して、LINQ操作をしてみたいと思います。
RSS(2.0)フィードはrss-channel-itemノードが配列になっているので、この配列をベース(From)にしてLINQ操作を行います。

ベースソース

var Enumerable = require('linq');

var request = require('request');
var url = 'http://kimux.net/?feed=rss2';

request(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        var json = xml2json(body);
        /*
        jsonに対してLINQ操作
        */
    }
});

function xml2json(body) {
    return JSON.parse(require('xml2json').toJson(body));
}       

Select 1

        // Select - すべての記事のタイトルを列挙 ①
        console.log("\nSelect 1 - ");
        Enumerable.From(json.rss.channel.item)
            .Select("$.title")
            .WriteLine();

Selectにはイテレータ($)を使って要素にアクセスし目的のプロパティを取り出すやり方が基本形なのかな。

Select 2

        // Select - すべての記事のタイトルを列挙 ②
        console.log("\nSelect 2 - ");
        var titles = 
            Enumerable.From(json.rss.channel.item)
                .Select("$.title");
        titles.ForEach("console.log($)");

Selectの戻りは単純に要素の配列ではなくEnumerableとなっているので、継続してLINQ操作をすることができます。

Select 3

        // Select - すべての記事のタイトルを列挙 ③
        console.log("\nSelect 3 - ");
        Enumerable.From(json.rss.channel.item)
            .WriteLine("$.title");

単に表示させるだけならWriteLineに表示する要素を指定することも可能。
Select1,2,3 実行画面

Select 1 2 3 -
[Node.js]XMLをJSONに変換して操作する。
[C#]JSON.Netを使ってWebサービスから取得したJSONを扱うときのメモ。
[雑記]Nortonさんの延長画面がソレっぽく見える件。
[雑記]上原ひろみちゃんにWONDER AIRPORTに出て欲しかった。
[上原ひろみ]オフィシャル スマートフォンサイトオープン!
[雑記]Windows8は普及するのか。
[上原ひろみ]Solo@BlueNoteToKyo 2日目2nd!
[Webアプリ]nginxを使ってWebSocketのリバースプロキシを設定する。
[PC]VMware Player 5でUbuntuを手動インストールする方法。
[Webアプリ]WebSocketとGoogleMapsでリアルタイム監視マップを作る。その3。

Select 4

        // Select - すべての記事のタイトルを列挙 ④
        console.log("\nSelect 4 - ");
        Enumerable.From(json.rss.channel.item)
            .Select(function(value, index){
                return index + ":" + value.title;
            })
            .WriteLine();

indexを知ることも可。これは.Netよりも楽。
Select4 実行画面

Select 4 -
0:[Node.js]XMLをJSONに変換して操作する。
1:[C#]JSON.Netを使ってWebサービスから取得したJSONを扱うときのメモ。
2:[雑記]Nortonさんの延長画面がソレっぽく見える件。
3:[雑記]上原ひろみちゃんにWONDER AIRPORTに出て欲しかった。
4:[上原ひろみ]オフィシャル スマートフォンサイトオープン!
5:[雑記]Windows8は普及するのか。
6:[上原ひろみ]Solo@BlueNoteToKyo 2日目2nd!
7:[Webアプリ]nginxを使ってWebSocketのリバースプロキシを設定する。
8:[PC]VMware Player 5でUbuntuを手動インストールする方法。
9:[Webアプリ]WebSocketとGoogleMapsでリアルタイム監視マップを作る。その3。

Where

        // Where - タイトルに"雑記"を含む記事を表示
        console.log("\nWhere - ");
        Enumerable
            .From(json.rss.channel.item)
            .Where("$.title.indexOf('雑記') != -1")
            .Select("$.title")
            .WriteLine();

functionを使用することもできるけどイテレータを使うのが簡単で分かりやすい。
Where 実行画面

Where -
[雑記]Nortonさんの延長画面がソレっぽく見える件。
[雑記]上原ひろみちゃんにWONDER AIRPORTに出て欲しかった。
[雑記]Windows8は普及するのか。

ちなみに、次の様な書き方も出来る。

        // Where - タイトルに"雑記"を含む記事を表示
        console.log("\nWhere - ");
        Enumerable
            .From(json.rss.channel.item)
            .Where("p=>p.title.indexOf('雑記') != -1")
            .Select("$.title")
            .WriteLine();

Count

        // Count - タイトルに"雑記"を含む記事の件数
        console.log("\nCount - ");
        var cnt = 
            Enumerable
                .From(json.rss.channel.item)
                .Count("$.title.indexOf('雑記') != -1");
        console.log("Count = " + cnt);

LINQはWhereを使用しないで、Countに直接条件を書くことができます。
Count 実行画面

Count -
Count = 3

Any

        // Any - タイトルに"雑記"を含む記事の有無
        console.log("\nAny - ");
        var any = 
            Enumerable
                .From(json.rss.channel.item)
                .Where("$.title.indexOf('雑記') != -1")
                .Any();
        console.log("Any = " + any);

Any 実行画面

Any -
Any = true

Take

        // Take - 最新記事2件のタイトルを表示
        console.log("\nTake - ");
        Enumerable
            .From(json.rss.channel.item)
            .Take(2)
            .Select(function(value, index){
                return index + ":" + value.title;
            })
            .WriteLine();

Take 実行画面

Take -
0:[Node.js]XMLをJSONに変換して操作する。
1:[C#]JSON.Netを使ってWebサービスから取得したJSONを扱うときのメモ。

Skip

        // Skip - 最新記事2件目以降のタイトルを表示
        console.log("\nSkip - ");
        Enumerable
            .From(json.rss.channel.item)
            .Skip(2)
            .Select("$.title")
            .WriteLine();

Skip 実行結果

Skip -
[雑記]Nortonさんの延長画面がソレっぽく見える件。
[雑記]上原ひろみちゃんにWONDER AIRPORTに出て欲しかった。
[上原ひろみ]オフィシャル スマートフォンサイトオープン!
[雑記]Windows8は普及するのか。
[上原ひろみ]Solo@BlueNoteToKyo 2日目2nd!
[Webアプリ]nginxを使ってWebSocketのリバースプロキシを設定する。
[PC]VMware Player 5でUbuntuを手動インストールする方法。
[Webアプリ]WebSocketとGoogleMapsでリアルタイム監視マップを作る。その3。

まとめ
.NetFrameworkのLINQを知っていれば、すぐにマスターできるのでは。LINQを使えばループと条件分岐を大幅に減らすことができるのでコードが短く書けますしね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


This blog is kept spam free by WP-SpamFree.