Room 3100

linq.jsを触ってみた

概要

linq.jsという、データを汎用的に処理するクエリ機能を試してみました。

前置き

先日からvue.jsというMVVMライクな実装を可能にするライブラリを触っています。 MVVMといえばSilverlightWPF。 元々Microsoftが流行らせようとしたパターンです。

そのMicrosoftが開発したもう1つの便利ツールがあります。

LINQです。 あまりご存知でない方のために簡単に説明しますと、データの形態を気にせずに、汎用的に使えることを目指した強力なクエリ機能です。

統合言語クエリ (LINQ: Language-Integrated Query)

このLINQC#VisualBasic向けなんですが、 有志が雰囲気そのままにJavaScriptへ移植していることは以前から知っていました。

今回MVVMもやるんだし、ちょうど良い機会だろうということで実際に触ってみることにしました。

導入方法

  • //cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/jquery.linq.min.js
  • //cdnjs.cloudflare.com/ajax/libs/linq.js/2.2.0.2/linq.min.js

上記2ライブラリを組み込むのがとりあえず触るには簡単かと思います。


使い方

JSON

demo = Enumerable.From(json)
  .Where((x) -> isSameMonth(date, new Date(x.date)))
  .Where((x) -> checkedMenu.indexOf(x.menu) >= 0)
  .Select((x) -> x.name)
  .ToArray()
  • Enumerable.From()json形式のオブジェクトを取り込むことが出来ます。
  • Where()は条件節。該当するデータのみ次へ送ります。
  • Select()は出力対象を指定します。
  • ToArray()で実際に処理が実行されます。LINQは遅延処理

DOM

checked = $("input[id^=check]").toEnumerable()
  .Where("$.attr('checked') == 'checked'")
  .ToArray()
  • toEnumerable()jQueryのセレクタを取り込めます。
  • Where()の中のような表現で書くことも出来ます。

注意点: クエリは遅延実行

上にもさらっと書きましたが、LINQは実行されるまではただのクエリです。

ToArray()などで呼び出すことで、実際に処理が行われます。

# ただのクエリ。処理はまだ行われない
query = Enumerable.From(json)
  .Where((x) -> x.price >= 500)

# ここで初めて処理が実行される
arr = query.ToArray()

# やはり、まだ処理は行われない
query2 = query.OrderBy((x) -> x.price)

arr2 = query2.Select((x) -> { name: x.name, price: x.price })
         .ToArray() # ここで処理が行われる

クエリの種類

その数なんと90種類! LINQにあるものは大抵用意されているようです。独自のものもあります。

少しだけ紹介します。

GroupBy

Enumerable.From(json)
  .GroupBy("$.menu", null,
    "{ y: $$.Count(), name: $}")
  .ToArray()

GroupBy()は集計用によく用いられる関数です。

  • 第1引数はキー
  • 第2引数は中間データを加工する際に使用?
  • 第3引数で出力データを指定。$$は集計関数用

Join

Enumerable.From(jsonA)
  .Join(jsonB, "$.id", "$.id", "{idA: $.id, valA: $.val, valB: $$.val}")
  .ToArray()

2つのデータを紐付けする関数です。

  • 第1引数に別データ
  • 第2引数と第3引数にキー
  • 第4引数に出力形式。$$は2番めのデータ。

OrderBy

Enumerable.From(json)
  .OrderByDescending("$.y")
  .ToArray()

これはわかりますよね。順序付けを行う関数です。OrderByDescending()は降順。

Take

Enumerable.From(json)
  .Take(10)
  .ToArray()

先頭から指定件数だけ取得する関数です。

その他

公式サイトにもサンプルがあるので、そちらもどうぞ。

http://linqjs.codeplex.com/wikipage?title=linq.js%20Samples

感想

さらっと上辺をなぞっただけですが、いかがでしたでしょうか。 JavaScript上でのデータ操作や集計が、とても簡単になりそうな印象を受けました。 LINQ自体に慣れ親しんでいる方からすると、 割りと直感的に使えるのではないかと思います。

linq.js、なかなかオススメです。

© 2015 3100 - All code snippets on this site is licensed under a Creative Commons Attribution 3.0 Unported License.