2010-03-19 201 views
92

我正在尋找一個JavaScript庫,允許我使用類似LINQ的語法來查詢複雜的JSON對象。快速搜索發現一對夫婦的,看起來,他們可能會提供我所需要的有前途的選擇:什麼是領先的LINQ for JavaScript庫?

LINQ to JavaScriptjLinq

  • 任何一個是否有使用它們的經驗 ?
  • 有什麼優點和缺點?
  • 性能是否可比?
  • 是否 LINQ到JavaScript的功能,通過語法提供任何隱性福利 (我個人覺得 JLINQ的語法上的第一 一目瞭然更具吸引力的)?
  • 你發現在任一項目中缺少 ?
  • 你有沒有試過聯繫作者?他們的反應如何?
  • 什麼項目更廣泛使用?

編輯:

剛看到這個今天:jslinq

我認爲這將是第一個徹底嘗試。

+0

我剛剛發佈jinqJs.com開源項目,那應該對你有所幫助。 – NYTom 2015-03-29 16:04:04

+0

嘗試使用LINQ 4 ES 2015,http://fermium-co.github.io/LINQ4ES2015/ 使用相同C#語法的所有LINQ方法。 實現了與對象規範相同的.NET LINQ。 – 2015-08-24 18:51:21

+0

幾年前,我發佈了dinqyjs.com,它有一個類似Linq的語法和許多功能。 – garryp 2017-02-17 16:36:26

回答

14

你見過Rx for Javascript,沒有?那就是你想要的。

+1

感謝您的鏈接,我沒有看到這一點,並在查看項目頁面和視頻的這個和Rx後,我已經可以看到這可能是方便的。 但是,這不是我要找的。我想對具有多層嵌套的JSON對象執行類似LINQ的查詢。 – 2010-03-22 22:50:09

+0

是的,你可以使用Rx來做到這一點 - 它用於以反應/異步(即AJAX風格)的方式查詢任何數據或對象,請參閱抓取JSON數據然後使用Rx庫在此處查詢它的示例:http://codebetter。com/blogs/matthew.podwysocki/archive/2010/03/17/-reactive-extensions-for-javascript-released.aspx – 2010-03-23 05:07:48

+2

我正要提出這個建議,但它與linq對象並不相同。 (如果是這樣,爲什麼我們需要在.NET中同時使用Rx和Linq作爲對象?)它在數據流方面與普通Linq相反。 – 2010-03-23 08:24:16

30

在廣泛使用的JS庫中,最基本和經常使用的Linq運算符是非常普遍定義的。他們只是有不同的名字(實際上,他們比Linq有更多的傳統名字)。 Select變成mapWhere變成filter,FirstFirstOrDefault變成[0]

幾乎沒有我知道的庫(包括我認爲鏈接到的那些庫)在.NET Linq中懶得實現惰性,他們只是使用數組立即進行評估。

對於一個非常漂亮的,完整的功能列表操作,請嘗試:http://osteele.com/sources/javascript/functional/

+0

熟悉LINQ,保持同樣的語法將是一個巨大的幫助。懶加載不是一個問題。這看起來好像具有我需要的所有功能,但我必須嘗試一些。我現在仍然保持這個問題的公開性,希望有人會絆倒誰使用JavaScript LINQ庫並分享他們的經驗。過了一段時間,如果沒有人做,我一定會給你答案。 – 2010-03-22 23:03:34

+22

@Tom - 我傾向於對圖書館有點謹慎,試圖模仿在Y語言中使用X語言的經驗,如果已經有一種在Y語言中做同樣事情的好方法。我認爲學習「成語「。在Linq出來之前,人們正在用JS編寫函數序列操作符,並且在JS中他們保留了」傳統「Lispy名字和方法,所以現在是更多的JS風格。所以我說「當在羅馬......」即使我在C#中垂直排列的花括號,但在JS和Java中,我把第一個放在同一行上,等等。 – 2010-03-23 08:28:36

+2

非常有用答案 - 特別是'選擇'映射到'地圖'。在這種情況下,可以使用underscore.js – PandaWood 2011-09-15 00:57:35

64

您可能想查看linq.js。它遵循.NET lambda語法,並且看起來很好地集成在Microsoft環境中。

LINQ對JavaScript - http://linqjs.codeplex.com/

優點

  • 實現了所有的.NET 4。0方法
  • 完全懶評價
  • 全智能感知的VisualStudio
  • 支持支持jQuery的
  • 支持Windows腳本宿主
  • 綁定無功擴展爲JavaScript(RxJS)和智能發電機
  • 的NuGet安裝支持
  • 最近更新(2011年1月最後發佈)
  • 語法符合C#中的lambda語法

缺點

  • 的linq.js庫是有點大。
  • 如果您已經在使用jQuery或其他js庫,最常用的功能可能已經可用。特別參見jQuery的filter和'Any'方法。
+2

剛剛發現幾個linq樣庫的性能比較:http://danieltao.com/lazy.js/comparisons.html – 2014-01-27 10:32:15

+0

Typescript def文件很熱! – kevp 2015-09-08 20:18:23

+1

@AlexeyF雖然沒有linq.js? – Alex 2015-10-15 11:20:18

10

我建議考慮看看underscore.js。它不像其他一些LINQ端口那樣直接,但是非常舒適的「類LINQ」體驗。它支持我需要的所有過濾器,排序和項目選項,並且具有出色的文檔和社區支持。

作爲Knockout用戶的獎勵,有UnderscoreKO將Underscore的數組方法添加到Knockout的可觀察數組中。 Demo

+3

我也明確地建議下劃線。不幸的是,所有可用的庫都缺乏性能。作爲一名C#開發人員,我很想擁有面向JavaScript的庫的c#語法,但是沒有任何可用的。所有前面提到的庫都是「javascript包裝器」,這意味着他們嘗試以c#的方式實現LINQ函數。例如,查看linq.js,他們有一個Dictionary,爲getter進行線性搜索。優越的性能,但他們實現了GetHashCodes等。 – 2013-10-26 17:41:42

+4

LINQ的顯着特點是懶惰評估。 Underscore.js沒有這個功能。但是,[lodash](http://lodash.com)是一個下劃線的超集,性能更好,並且支持鏈式方法的延遲評估: var arr = _.range(1000); (100).value();()函數返回一個數組, – srgstm 2015-06-09 13:57:25

+3

是的......這是前一段時間寫的;我現在也可能會推薦lodash。我一直在考慮讓UnderscoreKO允許lodash。但我不確定我是否認同懶惰評價是LINQ的「鮮明特徵」。大多數情況下,我對LINQ的欣賞是,它通常比其他方式更好地表達意圖。只是一個想法。無論如何,這兩個好的圖書館。 – 2015-06-10 15:26:17

3

$ LINQ:http://jscriptlinq.codeplex.com/

var users = [{username: "asmith", domain: "north_america"}, 
    {username: "tmcfarland", domain: "europe"}, 
    {username: "cdeckard", domain: "nort_america"}]; 

var groups = [{user: "ASMITH", groupName: "base_users"}, 
    {user: "TMCFARLAND", groupName: "admins"}, 
    {user: "CDECKARD", groupName: "base_users"}, 
    {user: "CDECKARD", groupName: "testers"}]; 

var results = $linq(users).join(groups, 
    function (x) { return x.username; }, // key for 'users' 
    "x => x.user",       // key for 'groups' 
    function (outer, inner)     // function to generate results 
    { 
     return "user: " + outer.username + 
      ", domain: " + outer.domain + 
      ", group: " + inner.groupName; 
    }, 
    "(x, y) => x.toLowerCase() == y.toLowerCase()"); // compare keys case-insensitively 
2

有一些複製庫外面,試圖端口LINQ到JavaScript和類似的語法和方法名。但是,在JS社區中,真正受歡迎的並提供相同功能的庫是Underscore.js

1

我正在尋找這樣的事情我自己,碰上了......

http://www.hugoware.net/Projects/jLinq

這看起來真的很棒!也許我只是不明白Rx和observables的意義,而不是像jQuery那樣設置事件處理程序。

4

我個人發現LINQ/set操作聯合,相交,除了和在.NET中的枚舉不同。很有用。有一個叫做jQuery Array Utilities的jquery插件,它提供了這些方法用於數組。

代碼示例:

$.distinct([1, 2, 2, 3]) 

返回[1,2,3]

$.union([1, 2, 2, 3], [2, 3, 4, 5, 5]) 

返回[1,2,3,4,5]

$.instersect([1, 2, 2, 3], [2, 3, 4, 5, 5]) 

返回[ 2,3]

$.except([1, 2, 2, 3], [3, 4, 5, 5]) 

退貨[1,2]

+0

這個包[jquery-array-utilities](https://libraries.io/bower/jquery-array-utilities)也可以使用[bower](https://bower.io)進行安裝。我想添加一個免責聲明,我最初做的插件:) – 2016-11-28 21:26:01