본문 바로가기

Javascript

Linq.js 살펴보기

아나 이렇게 좋을수가 javascript에서 linq가 되다니 아 좋다....

 실제적으로 얼마나 활용도가 있을지는 모르지만 아 좋네......

http://neue.cc/reference.htm = > 여기서 실제적으로 링큐 결과가 어떻게 나오는지 테스트 해볼수 있다.

 http://linqjs.codeplex.com/  = > 여기서 소스를 다운받고 document를 볼수 있다. 

visual studio를 사용한다면 nuget으로 다운받을 수 있다.

간단하게 소개하자면 이렇다.

  • .NET 4.0 메서드들과 그외의 메서드들을 구현했고 
  • lazy evaluation도 된다 
  • visual studio에서는 인텔리 센스도 제공된다
  • 두가지 버전이 있는데 linq.js 그리고 jquery 플러그인으로 제공되는 jquery.linq.js가 있다.
 
1. Query objects 또는 json
var jsonArray = [ { "user": { "id": 100, "screen_name": "d_linq" }, "text": "to objects" },
{ "user": { "id": 130, "screen_name": "c_bill" }, "text": "g" },
{ "user": { "id": 155, "screen_name": "b_mskk" }, "text": "kabushiki kaisha" },
{ "user": { "id": 301, "screen_name": "a_xbox" }, "text": "halo reach" } ]
// ["b_mskk:kabushiki kaisha", "c_bill:g", "d_linq:to objects"]
var queryResult = Enumerable.From(jsonArray) .Where(function (x) { return x.user.id < 200 }) .OrderBy(function (x) { return x.user.screen_name }) .Select(function (x) { return x.user.screen_name + ':' + x.text }) .ToArray();
// shortcut! string lambda selector
var queryResult2 = Enumerable.From(jsonArray) .Where("$.user.id < 200") .OrderBy("$.user.screen_name") .Select("$.user.screen_name + ':' + $.text") .ToArray();

2. 
High compatibility with C# Linq
// C# LINQ (delegate)
Enumerable.Range(1, 10) .Where(delegate(int i) { return i % 3 == 0; }) .Select(delegate(int i) { return i * 10; }); // linq.js - anonymous function
Enumerable.Range(1, 10) .Where(function(i) { return i % 3 == 0; }) .Select(function(i) { return i * 10; });
// C# LINQ (lambda)
Enumerable.Range(1, 10).Where(i => i % 3 == 0).Select(i => i * 10);
// linq.js - lambda expression
Enumerable.Range(1, 10).Where("i => i % 3 == 0").Select("i => i * 10");
// $ is default iterator variable like Scala's "_" or Groovy's "it"
Enumerable.Range(1, 10).Where("$ % 3 == 0").Select("$ * 10");
// "" is shorthand of "x => x" (identity function)
Enumerable.Range(4, 7).Join(Enumerable.Range(8, 5), "", "", "outer,inner=>outer*inner");
// Enumerable.From is wrap from primitive array, string(to charArray), object(to KeyValuePair[]) etc..
var array = [100, 200, 30, 40, 500, 40, 200]; var ex1 = Enumerable.From(array).Distinct().ToArray();
// [100, 200, 30, 40, 500]
var ex2 = Enumerable.From("foobar").ToArray();
// ["f", "o", "o", "b", "a", "r"];
var ex3 = Enumerable.From({foo:10, bar:20}).ToArray();
// [{Key:"foo",Value:10}, {Key:"bar",Value:20}] // C# - AnonymousType
array.Select((val, i) => new { Value = val, Index = i });
// linq.js - object literal
Enumerable.From(array).Select("val,i=>{Value:val, Index:i}")

3. jQuery plugin version
// $.Enumerable
$.Enumerable.Range(1, 10).Where("$%2==0").ForEach("alert($)");
// TojQuery - Enumerable to jQuery
$.Enumerable.Range(1, 10) .Select(function (i) { return $("<option>").text(i)[0] }) .TojQuery() .appendTo("#select1");
// toEnumerable - jQuery to Enumerable
var sum = $("#select1").children() .toEnumerable() .Select("parseInt($.text())") .Sum(); // 55