什么是领先的JavaScript库LINQ?

Tom*_*sky 95 javascript linq json

我正在寻找一个JavaScript库,它允许我使用类似LINQ的语法查询复杂的JSON对象.快速搜索找到了几个看起来可能提供我需要的有前景的选项:

LINQ to JavaScriptjLinq

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

编辑:

今天刚看到这个:jslinq.

我认为这将是第一个彻底试用的人.

Nat*_*mer 71

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

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

优点

  • 实现所有.NET 4.0方法
  • 完成懒惰的评估
  • 完整的IntelliSense支持VisualStudio
  • 支持jQuery
  • 支持Windows脚本宿主
  • 绑定JavaScript(RxJS)和IntelliSense生成器的Reactive Extensions
  • NuGet安装支持
  • 最近更新(2011年1月最后一次发布)
  • 语法符合C#中的lambda语法

缺点

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

  • 刚刚找到几个类似linq的库的性能比较:http://danieltao.com/lazy.js/comparisons.html (2认同)

Dan*_*ker 33

最基本和最常用的Linq运算符在广泛使用的JS库中非常常见.它们只有不同的名称(实际上,它们的名称比Linq更为传统).Selectmap,Wherefilter,FirstFirstOrDefault[0].

几乎没有我知道的库(包括我认为你链接的那些)在.NET Linq中使得实现变得懒惰,他们只是立即使用数组进行评估.

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

  • @Tom - 我倾向于对那些试图模拟在语言Y中使用语言X的经验的图书馆保持警惕,如果已经有一种很好的方法在语言Y中做同样的事情.我认为最好学习"成语"语言Y.人们在Linq出来之前在JS中编写函数序列运算符,而在JS中他们保留了"传统的"Lispy名称和方法,所以现在更具JS风格.所以我说"什么时候在罗马......"甚至在我如何布置花括号的范围内,在C#中垂直排列,但在JS和Java中,我把第一个放在同一行,等等. (24认同)
  • 非常有用的答案 - 特别是'选择'映射到'地图'.在这种情况下,也可以使用underscore.js (2认同)

Ric*_*ein 13

你看过Rx for Javascript了吗?那正是你想要的.

  • 我讨厌这是公认的答案.是的,当然,在学术上有趣的是.NET中的可观察量类似于可枚举,但那又如何?几乎没有人谁发现其实这个问题要RX /可观(目前已经有很多的,在淘汰赛中,angularjs等更多有用的实现)和答案本身甚至没有试图解释的相关性是什么,即使是真的是最合适的选择,它几乎不"领先" - 它的下载量约为linq.js的1/5. (21认同)
  • 我打算建议这个,但它与对象的linq并不完全相同.(如果是的话,为什么我们需要Rx和Linq到.NET中的对象?)它在数据流方面与普通Linq的工作方向相反. (2认同)
  • @Aaronaught答案是在3年前给出的,而且一切都已经改变了,并且linq.js现在要比当年的要早。当时,我认为rx.js是使用JS进行LINQ操作的最佳选择,因为其他库不是很好或不完整,并且RX有专职开发人员在处理它。另外,在JavaScript中,IMO很重要,而IMO仍然很重要-这就是Observables的功能。最后,请注意,Rx中的Observables与Knockout和AngularJS Observables完全不同,并且具有不同的用途。您的意见被记录下来,您可以自由投票!:) (2认同)
  • @Aaronaught还有一点要注意...如果有人在寻找与LINQ相关的JavaScript库,那么他们肯定应该对Rx有所了解,因为它是100%LINQ,而了解LINQ但不了解Rx实际上只知道故事的一半。干杯。 (2认同)
  • 有了RX,Linq和JavaScript的丰富经验,我可以毫不犹豫地说,寻找类似Linq的JavaScript库的人确实*不需要知道RX,如果你明确定义"故事"成为一半RX.否则就是要求水域混乱,让那些有简单要求的人更难理解他们的选择.这就像是在告诉那些正在寻找自行车的人,他们需要先了解摩托车; 当然,这种关系很有意思,但在背景下并不是特别有用. (2认同)

Mat*_*ols 10

我建议看一下underscore.js.它不像其他一些直接的LINQ端口,但是非常舒适的"类LINQ"体验.它支持我需要的所有过滤器,排序和项目选项,并具有出色的文档和社区支持.

作为Knockout用户的奖励,有UnderscoreKO将Underscore的数组方法添加到Knockout的可观察数组中.演示

  • LINQ的显着特点是懒惰的评估.Underscore.js没有此功能.然而,[lodash](http://lodash.com)是下划线的超集,表现更好,并支持对链式方法的延迟评估:var arr = _.range(1000); _(arr).map(function(v){return v + 1;}).filter(function(v){return v%2;}).take(100).value(); (4认同)
  • 我也明确地建议下划线.不幸的是,所有可用的库都缺乏性能.作为我自己的开发者,我很想拥有一个面向javascript的库的c#语法,但是没有任何这样的可用.所有上述库都是"javascript wrappers",这意味着他们尝试用c#方式实现LINQ函数.例如,查看linq.js它们有一个Dictionary,对于getter进行线性搜索.Javascript的对象是一个字典与一个字典卓越的性能,但他们实现了GetHashCodes等. (3认同)
  • 是的......这是前一段时间写的; 我现在也可能推荐lodash.我一直在考虑让UnderscoreKO允许lodash.但我不确定我是否同意懒惰评估是LINQ的"特色".我对LINQ的理解主要是它通常比其他方式更好地传达意图.只是一个想法.无论如何都是好的图书馆. (3认同)

小智 5

我个人发现 .NET 中的可枚举类型有 LINQ/set 操作 Union、Intersect、Except 和 Distinct。很有用。有一个名为jQuery Array Utilities 的jquery 插件,它提供了在数组上使用的这些方法。

代码示例:

$.distinct([1, 2, 2, 3])
Run Code Online (Sandbox Code Playgroud)

返回 [1,2,3]

$.union([1, 2, 2, 3], [2, 3, 4, 5, 5])
Run Code Online (Sandbox Code Playgroud)

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

$.instersect([1, 2, 2, 3], [2, 3, 4, 5, 5])
Run Code Online (Sandbox Code Playgroud)

返回 [2,3]

$.except([1, 2, 2, 3], [3, 4, 5, 5])
Run Code Online (Sandbox Code Playgroud)

返回 [1, 2]