什么是领先的LINQ for JavaScript库?[关闭]


95

我正在寻找一个JavaScript库,该库将允许我使用类似LINQ的语法查询复杂的JSON对象。快速搜索发现了一些有希望的选择,这些选择似乎可以满足我的需求:

LINQ to JavaScriptjLinq

  • 有没有人有使用它们的经验?
  • 有什么优点和缺点?
  • 性能可比吗?
  • LINQ to JavaScript的函数传递语法是否提供任何隐藏的好处(我个人发现jLinq的语法乍一看更具吸引力)?
  • 您发现这两个项目中缺少什么?
  • 您是否曾经尝试与作者联系?他们反应如何?
  • 哪个项目使用更广泛?

我认为它将是第一个进行全面试用的人。


我刚刚发布了jinqJs.com开源项目,对您有帮助。
纽约纽约汤姆

尝试LINQ 4 ES 2015,fermium-co.github.io / LINQ4ES2015所有具有相同C#语法的LINQ方法。对对象规范实施相同的.NET LINQ。
Yaser Moradi

我几年前发布了dinqyjs.com,它具有类似Linq的语法并具有许多功能。
garryp

2
这个问题是旧的,正确关闭,但通过它谁发生的读者,LINQ的主要特点(过滤,转换和聚合)可以使用内置的执行filtermap以及reduce阵列功能。新的lambda语法有助于使代码看起来更类似于LINQ代码。
jpmc26

几个月前,我发布了Linq-Collectionsnpmjs.com/package/linq-collections)。它使用延迟执行和大量内部优化来快速发展。基于Microsoft的标准(如果您了解C#Linq,那么您就会知道linq-collection)
Ivan Sanz-Carasa

Answers:


13

您看过Rx for Javascript吗?那正是你想要的。


2
我打算提出这个建议,但这与linq to objects并不完全相同。(如果是这样,为什么在.NET中我们既需要Rx又需要Linq来连接对象?)就数据流而言,它的工作方向与普通Linq相反。
Daniel Earwicker 2010年

23
我讨厌这是公认的答案。是的,当然,.NET中的可观察对象与可枚举对象相似,这在学术上很有趣,但是那又如何呢?几乎没有人发现这个问题实际上是想要RX / observables(在淘汰赛,angularjs等中已经有很多有用的实现了),答案本身甚至没有试图解释相关性,即使它是确实是最合适的选择,它几乎不是“领先”的-linq.js的下载量约为1/5。
Aaronaught

2
@Aaronaught答案是在3年前给出的,而且一切都已经改变了,并且linq.js现在比当年还早。当时,我认为rx.js是使用JS进行LINQ操作的最佳选择,因为其他库不是很好或不完整,并且RX有专职开发人员在处理它。同样,异步在javascript中很重要,而IMO仍然很重要-这是Observables的功能。最后,请注意,Rx中的Observables与Knockout和AngularJS Observables完全不同,并且具有不同的用途。您的意见被记录下来,您可以自由投票!:)
理查德·安东尼·海因

2
@Aaronaught还有一点要注意...如果有人在寻找与LINQ相关的JavaScript库,那么他们肯定应该对Rx有所了解,因为它是100%LINQ,而了解LINQ但不是Rx真的只知道故事的一半。干杯。
理查德·安东尼·海因

2
拥有与RX,LINQ的,和JavaScript有丰富的经验,我可以毫不犹豫地说,有人找的LINQ像JavaScript的肯定并库并不需要了解RX,这是只有一半的故事,如果你专门定义“的故事” RX的一半。声称否则会造成混乱,使要求简单的人更难以理解他们的选择。这就像告诉某个正在寻找自行车的人,他们首先需要了解摩托车。当然,这种关系很有趣,但是在上下文中并不是特别有用。
Aaronaught

71

你可能想看看linq.js。它遵循.NET lambda语法,并且看起来可以很好地集成到Microsoft环境中。

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

优点

  • 实现所有.NET 4.0方法
  • 完成懒惰评估
  • 对VisualStudio的完全IntelliSense支持
  • 支持jQuery
  • 支持Windows脚本宿主
  • 绑定JavaScript(RxJS)和IntelliSense Generator的反应性扩展
  • NuGet安装支持
  • 最近更新(最新版本,2011年1月)
  • 语法符合C#中的lambda语法

缺点

  • linq.js库有点大。
  • 如果您已经在使用jQuery或其他js库,则最常用的功能可能已经可用。特别参见jQuery的filter和'Any'方法。

2
刚刚发现了几个类似linq的库的性能比较:danieltao.com/lazy.js/comparisons.html
Alexey F

Typescript def文件很热!
kevp

1
@AlexeyF虽然没有linq.js吗?
亚历克斯(Alex)2015年

33

最基本和最常用的Linq运算符在广泛使用的JS库中很常见。它们只是具有不同的名称(实际上,它们比Linq中具有更多的传统名称)。SelectmapWherefilterFirstFirstOrDefault[0]

几乎没有我知道的库(包括我认为与您链接的库)像在.NET Linq中那样懒于使实现变得懒惰,它们只是立即使用数组求值。

要获得一组非常完整的功能列表操作,请尝试:http : //osteele.com/sources/javascript/functional/


熟悉LINQ,保持尽可能多的语法相同将是一个巨大的帮助。延迟加载不是问题。看来它确实具有我需要的所有功能,但是我必须尝试一些。我现在暂时不提问题,希望有人会偶然发现使用JavaScript LINQ库并分享经验的人。经过一段时间,如果没有其他人做,我一定会给您答案。
汤姆·特雷桑斯基

25
@Tom-我倾向于对尝试模仿在Y语言中使用X语言的体验的库保持警惕,如果已经有了在Y语言中做相同事情的好方法。我认为最好学习“成语”在Linq问世之前,人们就在JS中编写函数序列运算符,而在JS中,他们保留了“传统的” Lispy名称和方法,所以现在更多的是JS样式。所以我说“在罗马......”甚至到了我如何布局大括号,这排队垂直于C#的程度,但在JS和Java我把在同一行,等等。第一个
丹尼尔·埃里克

2
非常有用的答案-特别是“选择”映射到“地图”。在这种情况下,也可以使用underscore.js
PandaWood 2011年

1
联接两个数组呢?我试图弄清楚如何获取不在数组B中的数组A的元素,但是在JQuery中似乎没有办法做到这一点。在LINQ中这很简单。
Noel Abrahams

@Noel Abrahams-对于这种事情,为什么不使用ES5 Array方法而不是jQuery?例如a1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker 2011年

10

我建议看看underscore.js。它不是像其他端口一样直接使用LINQ端口,而是一种非常舒适的“类似于LINQ”的体验。它支持我需要的所有筛选器,排序和项目选项,并具有出色的文档和社区支持。

作为淘汰赛用户的奖励,有UnderscoreKO可以将Underscore的数组方法添加到Knockout的可观察数组中。演示版


3
我也绝对建议下划线。不幸的是,所有可用的库都缺乏性能。作为我自己的ac#开发人员,我很想在面向JavaScript的库中使用c#语法,但是没有任何此类可用。前面提到的所有库都是“ javascript包装器”,这意味着它们尝试以c#方式实现LINQ函数。例如,查看linq.js,它们具有一个Dictionary,该字典对getter进行线性搜索。性能优越,而是他们实现GetHashCodes等
乔治Mavritsakis

4
LINQ的显着特征是延迟评估。Underscore.js没有此功能。但是,有lodash是下划线的超集,性能更好,并且支持对链式方法的惰性求值:var arr = _.range(1000); _(arr).map(function(v){return v + 1;})。filter(function(v){return v%2;})。take(100).value();
srgstm,2015年

3
是的...这是前一段时间写的;我可能现在也推荐lodash。我一直在考虑分叉UnderscoreKO允许lodash。但是我不确定我是否同意惰性评估是LINQ的“特色”。通常,我对LINQ的欣赏是,它通常比其他做事方式更好地传达意图。只是一个想法。无论如何,都是好的图书馆。
马修·尼科尔斯

4

我个人发现.NET中可枚举的LINQ / set操作是Union,Intersect,Except和Distinct。很有用。有一个名为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]


这个软件包jquery-array-utilities也可以使用bower安装。我想添加一个我最初制作该插件的免责声明:)
Kristian Abrahamsen

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




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.