Was ist die führende LINQ for JavaScript-Bibliothek? [geschlossen]


95

Ich suche nach einer JavaScript-Bibliothek, mit der ich komplexe JSON-Objekte mit einer LINQ-ähnlichen Syntax abfragen kann. Eine schnelle Suche ergab einige vielversprechende Optionen, die möglicherweise das bieten, was ich brauche:

LINQ zu JavaScript und jLinq

  • Hat jemand Erfahrung damit?
  • Was sind einige Vor- und Nachteile?
  • Ist die Leistung vergleichbar?
  • Bietet die Funktionsübergabesyntax von LINQ an JavaScript versteckte Vorteile (ich persönlich finde die Syntax von jLinq auf den ersten Blick ansprechender)?
  • Was hat Ihnen in beiden Projekten gefehlt?
  • Haben Sie jemals versucht, die Autoren zu kontaktieren? Wie reaktionsschnell waren sie?
  • Welches Projekt wird häufiger eingesetzt?

Ich denke, es wird das erste sein, das gründlich ausprobiert wird.


Ich habe gerade das Open Source-Projekt jinqJs.com veröffentlicht, das Ihnen helfen sollte.
NYTom

Probieren Sie LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Alle LINQ-Methoden mit derselben C # -Syntax . Implementierte das gleiche .NET LINQ für Objektspezifikationen.
Yaser Moradi

Ich habe dinqyjs.com vor ein paar Jahren veröffentlicht, hat eine Linq-ähnliche Syntax und viele Funktionen.
Garryp

2
Diese Frage ist alt und richtig geschlossen, aber für Leser , die über es passieren, die wichtigsten Merkmale von LINQ (Filtern, Transformieren und Aggregation) können mit der eingebauten durchgeführt werden filter, mapund reduceArray - Funktionen. Die neue Lambda-Syntax trägt dazu bei, dass der Code dem LINQ-Code viel ähnlicher wird.
jpmc26

Vor ein paar Monaten habe ich veröffentlicht Linq-Collections( npmjs.com/package/linq-collections ). Es verwendet verzögerte Ausführungen und unzählige interne Optimierungen, um blitzschnell zu sein. Basierend auf dem Microsoft-Standard (wenn Sie C # Linq kennen, kennen Sie die Linq-Sammlungen)
Ivan Sanz-Carasa

Antworten:


13

Haben Sie Rx für Javascript schon gesehen? Das ist, was du willst.


2
Ich wollte dies vorschlagen, aber es ist nicht wirklich dasselbe wie linq für Objekte. (Wenn ja, warum benötigen wir in .NET sowohl Rx als auch Linq für Objekte?) In Bezug auf den Datenfluss funktioniert dies in entgegengesetzter Richtung zu normalem Linq.
Daniel Earwicker

23
Ich hasse es, dass dies die akzeptierte Antwort ist. Ja, sicher, es ist akademisch interessant, dass Observables in .NET Enumerables ähneln, aber was nun? Fast niemand, der diese Frage findet, möchte tatsächlich RX / Observables (es gibt bereits viel nützlichere Implementierungen davon in Knockout, Angularjs usw.), und die Antwort selbst versucht nicht einmal zu erklären, welche Relevanz dies hat, und selbst wenn dies der Fall war wirklich die am besten geeignete Wahl, es ist kaum "führend" - es hat ungefähr 1/5 der Downloads von linq.js.
Aaronaught

2
@Aaronaught Die Antwort wurde vor über 3 Jahren gegeben, und die Dinge haben sich definitiv geändert, und linq.js ist jetzt weit vor dem, was es damals war. Zu dieser Zeit war ich der Meinung, dass rx.js die beste Wahl für LINQ-Operationen mit JS ist, da die anderen Bibliotheken nicht großartig oder unvollständig waren und RX Vollzeitentwickler daran arbeitete. Außerdem war Async wichtig und ist IMO immer noch in JavaScript - genau das erhalten Sie mit Observables. Beachten Sie schließlich, dass Observables in Rx sich stark von Knockout- und AngularJS-Observables unterscheiden und unterschiedlichen Zwecken dienen. Ihre Meinungen werden notiert und Sie können abstimmen! :)
Richard Anthony Hein

2
@Aaronaught Noch ein Hinweis ... Wenn jemand nach LINQ-bezogenen Bibliotheken für JavaScript sucht, sollte er auf jeden Fall über Rx Bescheid wissen, da es sich um 100% LINQ handelt. Wenn er LINQ kennt, aber nicht Rx, weiß er wirklich nur die halbe Wahrheit. Prost.
Richard Anthony Hein

2
Nachdem hatte umfangreiche Erfahrungen mit RX, Linq, und JavaScript, kann ich ohne zu zögern sagen , dass jemand für Linq wie Bibliotheken suchen JavaScript ist definitiv nicht brauchen , um über RX zu wissen, und es ist nur die halbe Wahrheit , wenn Sie speziell „die Geschichte“ definieren halb RX sein. Anders zu behaupten bedeutet, das Wasser zu trüben und es Menschen mit einfachen Anforderungen zu erschweren, ihre Optionen zu verstehen. Es ist, als würde man jemandem, der ein Fahrrad sucht, sagen, dass er zuerst etwas über Motorräder lernen muss. Sicher, die Beziehung ist interessant, aber im Kontext nicht besonders nützlich.
Aaronaught

71

Vielleicht möchten Sie linq.js auschecken . Es folgt der .NET-Lambda-Syntax und scheint gut in eine Microsoft-Umgebung integriert zu sein.

LINQ für JavaScript - http://linqjs.codeplex.com/

Vorteile

  • Implementiert alle .NET 4.0-Methoden
  • Komplette faule Bewertung
  • Volle IntelliSense-Unterstützung für VisualStudio
  • Unterstützt jQuery
  • Unterstützt Windows Script Host
  • Bindung für reaktive Erweiterungen für JavaScript (RxJS) und IntelliSense Generator
  • NuGet-Installationsunterstützung
  • Vor kurzem aktualisiert (letzte Veröffentlichung Jan 2011)
  • Die Syntax entspricht der Lambda-Syntax in C #

Nachteile

  • Die Bibliothek von linq.js ist etwas groß.
  • Wenn Sie bereits jQuery oder eine andere js-Bibliothek verwenden, ist die am häufigsten verwendete Funktionalität wahrscheinlich bereits verfügbar. Siehe insbesondere den Filter von jQuery und die Methoden 'Beliebig'.

2
Ich habe gerade einen Leistungsvergleich für mehrere linq-ähnliche Bibliotheken gefunden: danieltao.com/lazy.js/comparisons.html
Alexey F

Typescript def Datei ist heiß!
Kevp

1
@AlexeyF Keine linq.js?
Alex

33

Die grundlegendsten und am häufigsten verwendeten Linq-Operatoren werden sehr häufig in weit verbreiteten JS-Bibliotheken definiert. Sie haben nur unterschiedliche Namen (tatsächlich haben sie traditionellere Namen als in Linq). Selectwird map, Wherewird filter, Firstund FirstOrDefaultwerden [0].

Fast keine mir bekannte Bibliothek (einschließlich derjenigen, mit denen Sie verlinkt haben) macht sich die Mühe, die Implementierung so faul wie in .NET Linq zu gestalten. Sie wird nur sofort mithilfe von Arrays ausgewertet.

Versuchen Sie für eine sehr schöne, vollständige Reihe von Funktionslistenoperationen: http://osteele.com/sources/javascript/functional/


Es wäre eine große Hilfe, mit LINQ vertraut zu sein und die Syntax so weit wie möglich beizubehalten. Das träge Laden ist kein Problem. Dies scheint alle Funktionen zu haben, die ich brauche, aber ich muss einige experimentieren. Ich halte die Frage vorerst offen, in der Hoffnung, dass jemand darüber stolpert, der die JavaScript LINQ-Bibliotheken verwendet hat, und seine Erfahrungen teilt. Nach einiger Zeit werde ich Ihnen die Antwort geben, wenn es niemand anderes tut.
Tom Tresansky

25
@Tom - Ich bin etwas vorsichtig mit Bibliotheken, die versuchen, die Erfahrung mit der Verwendung von Sprache X in Sprache Y zu simulieren, wenn es bereits eine gute Möglichkeit gibt, dasselbe in Sprache Y zu tun. Ich denke, es ist besser, die "Redewendungen" zu lernen "of language Y. Die Leute haben funktionale Sequenzoperatoren in JS geschrieben, bevor Linq herauskam, und in JS haben sie die" traditionellen "Lispy-Namen und -Ansätze beibehalten, also ist das jetzt der JS-Stil. Also sage ich "Wenn in Rom ..." Sogar in dem Maße, wie ich geschweifte Klammern auslege, die in C # vertikal ausgerichtet sind, aber in JS und Java setze ich die erste in dieselbe Zeile usw.
Daniel Earwicker

2
Sehr nützliche Antwort - insbesondere, dass "Karten auswählen" zu "Karte". In diesem Fall könnte auch underscore.js verwendet werden
PandaWood

1
Was ist mit dem Verbinden von zwei Arrays? Ich habe versucht herauszufinden, wie man die Elemente von Array A erhält, die sich nicht in Array B befinden, aber es scheint keine Möglichkeit zu geben, dies in JQuery zu tun. In LINQ ist das ziemlich trivial.
Noel Abrahams

@ Noel Abrahams - warum nicht die ES5-Array-Methoden anstelle von jQuery verwenden? zBa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

Ich empfehle einen Blick auf underscore.js . Es ist kein direkter LINQ-Port wie einige der anderen, aber es ist eine sehr komfortable "LINQ-ähnliche" Erfahrung. Es unterstützt alle Filter-, Sortier- und Projektoptionen, die ich benötige, und verfügt über eine hervorragende Dokumentation und Community-Unterstützung.

Als Bonus für Knockout- Benutzer gibt es UnderscoreKO , das die Array-Methoden von Underscore zu den beobachtbaren Arrays von Knockout hinzufügt. Demo


3
Ich würde definitiv auch einen Unterstrich vorschlagen. Leider mangelt es allen verfügbaren Bibliotheken an Leistung. Als AC # -Entwickler würde ich gerne eine C # -Syntax mit einer Javascript-orientierten Bibliothek haben, aber es gibt keine solche. Alle oben genannten Bibliotheken sind "Javascript-Wrapper", was bedeutet, dass sie versuchen, LINQ-Funktionen auf c # Weise zu implementieren. Wenn sie beispielsweise linq.js betrachten, haben sie ein Wörterbuch, das für den Getter eine lineare Suche durchführt. Das Objekt von Javascript ist ein Wörterbuch mit Überlegene Leistung, aber stattdessen implementierten sie GetHashCodes usw.
George Mavritsakis

4
Die Besonderheit von LINQ ist die verzögerte Bewertung. Underscore.js verfügt nicht über diese Funktionalität. Es gibt jedoch lodash , eine Obermenge von Unterstrichen, eine bessere Leistung und eine verzögerte Bewertung verketteter Methoden: var arr = _.range (1000); _ (arr) .map (Funktion (v) {return v + 1;}). filter (Funktion (v) {return v% 2;}). take (100) .value ();
srgstm

3
Ja ... das wurde vor einiger Zeit geschrieben; Ich würde wahrscheinlich auch lodash jetzt empfehlen. Ich habe darüber nachgedacht, UnderscoreKO zu gabeln, um lodash zuzulassen. Ich bin mir jedoch nicht sicher, ob ich damit einverstanden bin, dass die verzögerte Bewertung "die" Besonderheit von LINQ ist. Meistens schätze ich LINQ, dass es in der Regel Absichten besser kommuniziert als die alternativen Methoden, um Dinge zu tun. Nur ein Gedanke. Auf jeden Fall beide gute Bibliotheken.
Matthew Nichols

4

Ich persönlich finde die LINQ / Set-Operationen Union, Intersect, Except und Distinct für Aufzählungen in .NET. sehr hilfreich. Es gibt ein jquery-Plugin namens jQuery Array Utilities , das diese Methoden für Arrays bereitstellt.

Codebeispiele:

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

gibt zurück [1,2,3]

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

gibt zurück [1,2,3,4,5]

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

gibt zurück [2,3]

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

gibt [1, 2] zurück


Dieses Paket jquery-array-utilities kann auch mit bower installiert werden . Ich möchte einen Haftungsausschluss hinzufügen, dass ich das Plugin ursprünglich gemacht habe :)
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

Es gibt einige duplizierende Bibliotheken, die versuchen, LINQ mit einer ähnlichen Syntax und ähnlichen Methodennamen auf JavaScript zu portieren. In der JS-Community ist Underscore.js jedoch die Bibliothek, die immer beliebter wird und dieselbe Funktionalität bietet .




0

Ich habe kürzlich eine LINQ-Bibliothek für JavaScript erstellt. Es hat die meisten von .NET bereitgestellten LINQ-Funktionen implementiert und ist die schnellste aller LINQ-Bibliotheken.

http://fromjs.codeplex.com/

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.