我正在寻找一个JavaScript库,它允许我使用类似LINQ的语法查询复杂的JSON对象。快速搜索发现了一些有希望的选项,它们可能提供我需要的:
linq到javascript和jlinq
- 有什么经验吗使用它们?
- 有哪些利弊?
- 性能是否可比?
- 函数是否传递语法linq to javascript提供任何隐藏的好处(我个人认为一开始更具吸引力一瞥)?
- 你发现缺少什么在两个项目中?
- 你试过联系作者吗?他们的反应如何?
- 哪个项目使用得更广泛?
编辑:
今天刚看到这个:jslinq。
我认为这将是第一次进行彻底的试验。
- 我刚刚发布了jinqjs.com开放源码项目,应该对您有所帮助。
- 尝试linq4es2015,fermium-co.github.io/linq4es2015,所有linq方法都使用相同的C语法。实现了相同的.NET Linq to对象规范。
- 几年前我发布了dinqyjs.com,它有一个类似linq的语法和很多功能。
- 这个问题是老生常谈的,正确地说是封闭的,但是对于遇到它的读者来说,LINQ(过滤、转换和聚合)的主要特性可以使用内置的filter、map和reduce数组函数来执行。新的lambda语法有助于使代码看起来更像LINQ代码。
- 几个月前,我发布了Linq-Collections(npmjs.com/package/linq collections)。它使用延迟的执行和大量的内部优化来实现快速增长。基于微软的标准(如果你知道c linq,那么你就知道linq集合)
您可能想查看linq.js。它遵循.NET lambda语法,并且看起来很好地集成在Microsoft环境中。
linq for javascript-http://linqjs.codeplex.com/
赞成的意见
- 实现所有.NET 4.0方法
- 完成延迟评估
- 对VisualStudio的完全IntelliSense支持
- 支持jQuery
- 支持Windows脚本宿主
- javascript(rxjs)和IntelliSense生成器的无功扩展绑定
- Nuget安装支持
- 最近更新(最新版本2011年1月)
- 语法符合C中的lambda语法#
欺骗
- linq.js库有点大。
- 如果您已经在使用jquery或其他JS库,那么最常用的功能可能已经可用。请特别参见jquery的过滤器和"any"方法。
- 刚刚找到几个类似linq的库的性能比较:danieltao.com/lazy.js/comparisons.html
- typescript def文件很热!
- @但是Alexeyf没有Linq.js?
在广泛使用的JS库中,最基本和最常用的LINQ操作符是非常常见的。他们只是有不同的名字(事实上,他们有比林肯更传统的名字)。Select变为map,Where变为filter,First和FirstOrDefault变为[0]。
我所知道的几乎没有一个库(包括您链接到的库)会像在.NET LINQ中那样费心让实现变得懒惰,它们只是使用数组立即进行评估。
要获得一组非常好、完整的功能列表操作,请尝试:http://ostele.com/sources/javascript/functional/
- 熟悉linq,保持相同的语法将是一个巨大的帮助。懒惰的装载不是问题。这似乎有我需要的所有功能,但我必须进行一些实验。我现在就把这个问题保持在开放状态,希望有人会被谁使用了JavaScriptLinq库和分享他们的经验绊倒。过了一段时间,如果没有其他人,我一定会给你答案。
- @Tom-如果在语言y中已经有了一个很好的方法来模拟在语言y中使用语言x的经验,那么我倾向于对那些试图模拟在语言y中使用语言x的库有所警惕。我认为最好学习语言y的"习语"。在linq出现之前,人们在js中编写函数序列操作符,而在js中,他们保持着e"传统的"易懂的名字和方法,所以现在更多的是JS风格。所以我说"当在罗马……"甚至到我如何在C语言中竖直地竖起花键的时候,但是在JS和JAVA中,我把第一个放在同一行上,等等。
- 非常有用的答案-尤其是"选择"映射到"映射"。在这种情况下,还可以使用underline.js
- 加入两个数组怎么样?我试图弄清楚如何获取数组A中不在数组B中的元素,但在jquery中似乎没有这样做的方法。在林肯,这是很微不足道的。
- @Noel Abrahams——对于这种情况,为什么不使用ES5数组方法而不是jquery?如a1.filter(function(e) { return a2.indexOf(e) == -1; })。
- @丹尼尔,它不像写作那么整洁。除了(a2)。原则上我同意你的哲学。我只是觉得Linq可以被看作是一个语言无关的库,用于操作数组。
你看到过Rx for javascript吗?这就是你想要的。
- 谢谢你的链接,我没有看到这个,在查看了这个和RX的项目页面和视频之后,我已经知道这个在哪里可以用。但是,这不是我想要的。我想对具有许多嵌套级别的JSON对象执行类似LINQ的查询。
- 是的,你可以用RX来实现这一点——它是以一种反应/异步(即Ajax风格)的方式查询任何数据或对象,请看下面的例子:codebetter.com/blogs/matthew.podwysocki/archive/2010/03/17/…获取JSON数据然后使用RX库进行查询;
- 我本来打算建议这样做的,但它与LinqToObjects并不完全相同。(如果是的话,为什么我们需要在.NET中同时使用rx和linq-to对象?)在数据流方面,它的工作方向与正常的LINQ相反。
- 使用拉(IEnumerable)集合(包括集合中的单个项)可以执行的所有操作也可以使用推送接口(IOBServable)。这意味着LINQ查询。您只需要考虑事件或推送数据,但仍然可以用同样的方式进行查询。对于Javascript,我想他们认为System.Reactive在Ajaj/Ajax世界中是一个更高的优先级,也许是System.Interactive将在稍后推出。你可以用RX做任何事情,你可以用LinqToObjects做任何事情,你只需要把数据(或计算)推给你,而不是拉它们。
- @Richardhein你的预言实现了,System.Interactive for JS现在以[email protected]/sourcecontrol/changeset/view/&hellip的形式出现了。
- @ ChrisDaMour:
- 我讨厌这是公认的答案。是的,当然,在学术上,.NET中的可观测数据与可枚举数据相似是很有趣的,但那又是什么呢?几乎没有人发现这个问题真的想要Rx/Observables(在淘汰赛、AngularJS等中已经有了更有用的实现),答案本身甚至没有试图解释相关性是什么,即使它真的是最合适的选择,它也很难"领先"——它有大约1/5的linq下载量。JS。
- @Aaronought的答案是在3年前给出的,现在情况已经发生了明显的变化,Linq.js现在远远领先于当时的情况。当时,我认为rx.js是使用JS执行LINQ操作的最佳选择,因为其他库并不强大或不完整,并且rx有全职开发人员在处理它。此外,异步也是很重要的,在我看来,在javascript中仍然是如此——这就是你通过观察得到的结果。最后,RX中的注释可观测值与淘汰和AngularJS可观测值非常不同,并且具有不同的用途。你的意见被记录在案,你可以自由投票!:)
- @又一个音符…如果有人在为javascript寻找与linq相关的库,那么他们肯定应该知道rx,因为它是100%的linq,而知道linq但不知道rx实际上只知道一半的情况。干杯。
- 由于在RX、Linq和JavaScript方面拥有丰富的经验,我可以毫不犹豫地说,寻找类似Linq的JavaScript库的人肯定不需要了解RX,如果您将"故事"具体定义为半RX,那么这只是故事的一半。声称不这样做会使水变得浑浊,使那些要求简单的人更难理解他们的选择。这就像告诉寻找自行车的人,他们需要先了解摩托车;当然,这段关系很有趣,但在上下文中并不特别有用。
- @aaronaught给我举一个例子,说明您可以对您喜欢的任何其他库执行Linq操作,而不能对Rx执行这些操作。虽然其他库允许同步,"拉式"计算,Rx允许异步,"推式"计算,因此每个人都应该知道"一半的故事"。RX中的任何异步操作都可以以同步方式工作,但反过来就不是这样了。因此,我坚持我的答案,RX允许您在基于LINQ的计算中使用比任何其他类似于LINQ的"库"更强大的功能和更具表现力。简单的要求"或不是,RX可以做到这一切。
- @aaronaught肯定的是,linq.js有一些不错的Rx绑定。linqjs.codeplex.com/documentation?referringtitle=主页
- 当然,我们可以用rx来实现,但rx主要是为时间域建模。
我建议您看看underline.js。它不像其他港口那样是一个直接的LINQ港口,而是一个非常舒适的"LINQ式"体验。它支持我所需要的所有过滤器、排序和项目选项,并且拥有优秀的文档和社区支持。
作为淘汰用户的额外奖励,有一个underlineko将underline的数组方法添加到淘汰的可观察数组中。演示
- 我也会明确建议使用下划线。不幸的是,所有可用的库都缺少关于性能的信息。作为一个C开发人员,我很想用一个面向JavaScript的库来实现C语法,但是没有这样的库。所有上述的库都是"javascript包装器",这意味着它们试图以C_方式实现LINQ函数。例如,在linq.js中,他们有一个字典,对于getter,它执行线性搜索。Javascript的对象是一个性能优越的字典,但它们实现了gethashcodes等。
- LINQ的显著特点是懒惰的评价。underline.js没有此功能。但是,有一个lodash,它是下划线的超集,性能更好,并且支持对链接方法的延迟评估:var arr=.range(1000);u(arr).map(函数(v)返回v+1;).filter(函数(v)返回v%2;).take(100).value();
- 是的……这是不久前写的;我现在很可能还会推荐罗达什。我一直在考虑用叉形下划线来允许罗达什。但我不确定我是否同意延迟评估是Linq的"独特特征"。我对Linq最欣赏的是,它通常比其他方式更好地传达意图。只是一个想法。无论如何,这两个图书馆都不错。
I personally find the LINQ/set operations Union, Intersect, Except and Distinct on enumerables in .NET. very useful. There is a jquery plugin called jQuery Array Utilities which provides these methods to be used on arrays.
Code examples:
1
| $.distinct([1, 2, 2, 3]) |
返回[1,2,3]
1
| $.union([1, 2, 2, 3], [2, 3, 4, 5, 5]) |
返回[1,2,3,4,5]
1
| $.instersect([1, 2, 2, 3], [2, 3, 4, 5, 5]) |
返回[2,3]
1
| $.except([1, 2, 2, 3], [3, 4, 5, 5]) |
收益率〔1, 2〕
- 这个包jquery数组实用程序也可以使用bower安装。我想添加一个免责声明,说明我最初制作了插件:)
$linq:http://jscriptlinq.codeplex.com/
[cc lang="javascript"]var users = [{username:"asmith", domain:"north_america
I've tried out most of these -- and I really like $linq: http://jscriptlinq.codeplex.com/ the best. It simply works the way you would expect c# linq to work -- including the chain ability.
There are some duplicating libraries out there that try to port LINQ to JavaScript with a similar syntax and method names. However, in the JS community, the library that is getting really popular and providing the same functionality is Underscore.js.
I'm looking for something like this myself and came across...
http://www.hugoware.net/Projects/jLinq
This looks really great! Maybe I just don't understand the point of Rx and observables compared to setting event handlers through something like jQuery.
我最近制作了一个用于JavaScript的Linq库。它实现了.NET提供的大多数LINQ函数,是所有LINQ库中速度最快的。
网址:http://fromjs.codeplex.com/