Quelle est la principale bibliothèque LINQ pour JavaScript? [fermé]

95

Je recherche une bibliothèque JavaScript qui me permettra d'interroger des objets JSON complexes en utilisant une syntaxe de type LINQ. Une recherche rapide a trouvé quelques options prometteuses qui semblent offrir ce dont j'ai besoin:

LINQ vers JavaScript et jLinq

  • Quelqu'un a-t-il une expérience de leur utilisation?
  • Quels sont les avantages et les inconvénients?
  • La performance est-elle comparable?
  • La syntaxe de transmission de fonctions de LINQ to JavaScript offre-t-elle des avantages cachés (personnellement, je trouve la syntaxe de jLinq plus attrayante à première vue)?
  • Qu'est-ce qui vous manque dans l'un ou l'autre des projets?
  • Avez-vous déjà essayé de contacter les auteurs? Dans quelle mesure ont-ils été réactifs?
  • Quel projet est le plus utilisé?

Je pense que ce sera le premier à être testé en profondeur.

Tom Tresansky
la source
Je viens de publier le projet open source jinqJs.com, qui devrait vous aider.
NYTom
Essayez LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Toutes les méthodes LINQ avec la même syntaxe C #. Implémentation du même .NET LINQ aux spécifications d'objet.
Yaser Moradi
J'ai publié dinqyjs.com il y a quelques années, avec une syntaxe semblable à Linq et de nombreuses fonctionnalités.
garryp
2
Cette question est ancienne et à juste titre fermé, mais pour les lecteurs qui se trouvent à travers elle, les principales caractéristiques de LINQ (filtrage, transformation et agrégation) peuvent être effectuées en utilisant le construit en filter, mapet les reducefonctions de tableau. La nouvelle syntaxe lambda permet de rendre le code beaucoup plus similaire au code LINQ.
jpmc26
Il y a quelques mois, j'ai publié Linq-Collections( npmjs.com/package/linq-collections ). Il utilise des exécutions différées et des tonnes d'optimisations internes pour être extrêmement rapide. Basé sur la norme de Microsoft (si vous connaissez C # Linq, vous connaissez linq-collections)
Ivan Sanz-Carasa

Réponses:

13

Avez-vous déjà vu Rx pour Javascript ? C'est ce que tu veux.

Richard Anthony Hein
la source
2
J'allais suggérer cela mais ce n'est pas vraiment la même chose que linq aux objets. (Si c'était le cas, pourquoi aurions-nous besoin à la fois de Rx et de Linq pour les objets dans .NET?) Cela fonctionne dans la direction opposée à Linq normal en termes de flux de données.
Daniel Earwicker
25
Je déteste que ce soit la réponse acceptée. Oui, bien sûr, il est intéressant d'un point de vue académique que les observables dans .NET soient similaires aux énumérables, mais alors? Presque personne qui trouve cette question ne veut réellement de RX / observables (il y a déjà des implémentations beaucoup plus utiles de cela dans knockout, angularjs, etc.) et la réponse elle-même n'essaie même pas d'expliquer quelle est la pertinence, et même si c'était vraiment le choix le plus approprié, il est à peine "leader" - il a environ 1/5 des téléchargements de linq.js.
Aaronaught
2
@Aaronaught La réponse a été donnée il y a plus de 3 ans, et les choses ont définitivement changé, et linq.js est maintenant bien en avance sur ce qu'il était à l'époque. À l'époque, je pensais que rx.js était le meilleur pari pour effectuer des opérations LINQ avec JS, car les autres bibliothèques n'étaient pas excellentes ou incomplètes et RX avait des développeurs à plein temps qui travaillaient dessus. En outre, async était important et l'est toujours, IMO, en JavaScript - ce que vous obtenez avec Observables. Enfin, notez que les observables dans Rx sont très différents des observables Knockout et AngularJS, et ont des objectifs différents. Vos opinions sont notées et vous êtes libre de voter! :)
Richard Anthony Hein
2
@Aaronaught Encore une note ... si quelqu'un est à la recherche de bibliothèques liées à LINQ pour JavaScript, alors il doit absolument connaître Rx, car c'est 100% LINQ, et connaître LINQ mais pas Rx, ce n'est vraiment connaître que la moitié de l'histoire. À votre santé.
Richard Anthony Hein
2
Ayant une vaste expérience avec RX, Linq et JavaScript, je peux dire sans hésitation que quelqu'un qui recherche des bibliothèques de type Linq pour JavaScript n'a certainement pas besoin de connaître RX, et ce n'est que la moitié de l'histoire si vous définissez spécifiquement «l'histoire» être à moitié RX. Prétendre le contraire complique les choses et rend plus difficile pour les personnes ayant des exigences simples de comprendre leurs options. C'est comme dire à quelqu'un qui cherche un vélo qu'il doit d'abord se renseigner sur les motos; Bien sûr, la relation est intéressante, mais pas particulièrement utile dans le contexte.
Aaronaught le
71

Vous pouvez consulter linq.js . Il suit la syntaxe lambda .NET et semble bien intégré dans un environnement Microsoft.

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

Avantages

  • Implémente toutes les méthodes .NET 4.0
  • Évaluation paresseuse complète
  • Prise en charge complète d'IntelliSense pour VisualStudio
  • Prend en charge jQuery
  • Prend en charge l'hôte de script Windows
  • Liaison pour les extensions réactives pour JavaScript (RxJS) et IntelliSense Generator
  • Prise en charge de l'installation NuGet
  • Mis à jour récemment (dernière version en janvier 2011)
  • La syntaxe est conforme à la syntaxe lambda en C #

Les inconvénients

  • La bibliothèque linq.js est un peu volumineuse.
  • Si vous utilisez déjà jQuery ou une autre bibliothèque js, la fonctionnalité la plus couramment utilisée est probablement déjà disponible. Voir en particulier le filtre de jQuery et les méthodes 'Any'.
Nathan Palmer
la source
2
Je viens de trouver une comparaison des performances pour plusieurs bibliothèques de type linq
Alexey F
Le fichier de définition de typescript est CHAUD!
kevp
1
@AlexeyF Pas de linq.js cependant?
Alex
33

Les opérateurs Linq les plus basiques et les plus fréquemment utilisés sont très couramment définis dans les bibliothèques JS largement utilisées. Ils ont juste des noms différents (en fait, ils ont des noms plus traditionnels que dans Linq). Selectdevient map, Wheredevient filter, Firstet FirstOrDefaultdevenir [0].

Presque aucune bibliothèque que je connaisse (y compris celles auxquelles vous avez lié) ne se soucie de rendre l'implémentation paresseuse comme dans .NET Linq, elles évaluent juste immédiatement à l'aide de tableaux.

Pour un très bel ensemble complet d'opérations de liste fonctionnelle, essayez: http://osteele.com/sources/javascript/functional/

Daniel Earwicker
la source
Être familier avec LINQ, garder autant de syntaxe la même serait d'une grande aide. Le chargement paresseux n'est pas un problème. Cela semble avoir toutes les fonctionnalités dont j'ai besoin, mais je vais devoir en expérimenter quelques-unes. Je garde la question ouverte pour le moment, dans l'espoir que quelqu'un tombera sur qui a utilisé les bibliothèques JavaScript LINQ et partagera ses expériences. Après un certain temps, si personne d'autre ne le fait, je ne manquerai pas de vous donner la réponse.
Tom Tresansky
25
@Tom - J'ai tendance à me méfier un peu des bibliothèques qui tentent de simuler l'expérience de l'utilisation du langage X dans le langage Y s'il existe déjà un bon moyen de faire la même chose dans le langage Y. Je pense qu'il vaut mieux apprendre les "idiomes" "du langage Y. Les gens écrivaient des opérateurs de séquence fonctionnels dans JS avant la sortie de Linq, et dans JS ils ont gardé les noms et approches Lispy" traditionnels ", c'est donc maintenant le style le plus JS. Alors je dis "Quand à Rome ..." Même dans la mesure où je dispose des accolades, qui s'alignent verticalement en C #, mais en JS et Java j'ai mis le premier sur la même ligne, etc.
Daniel Earwicker
2
Réponse très utile - en particulier que «sélectionnez» des cartes à «carte». Dans ce cas, underscore.js pourrait également être utilisé
PandaWood
1
Qu'en est-il de la jonction de deux tableaux? J'essayais de comprendre comment obtenir les éléments du tableau A qui ne sont pas dans le tableau B, mais il ne semble pas y avoir de moyen de le faire dans JQuery. C'est assez trivial dans LINQ.
Noel Abrahams
@Noel Abrahams - pour ce genre de chose, pourquoi ne pas utiliser les méthodes ES5 Array au lieu de jQuery? par exemplea1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker
10

Je recommande de jeter un oeil à underscore.js . Ce n'est pas un port LINQ direct comme certains des autres, mais c'est une expérience «semblable à LINQ» très confortable. Il prend en charge toutes les options de filtrage, de tri et de projet dont j'ai besoin et dispose d'une excellente documentation et d'un support communautaire.

En prime pour les utilisateurs de Knockout , il existe UnderscoreKO qui ajoute les méthodes de tableau d'Underscore aux tableaux observables de Knockout. Démo

Matthew Nichols
la source
3
Je suggérerais définitivement un soulignement aussi. Malheureusement, toutes les bibliothèques disponibles manquent de performances. Étant moi-même développeur ac #, j'adorerais avoir une syntaxe c # avec une bibliothèque orientée javascript, mais il n'y en a pas. Toutes les bibliothèques susmentionnées sont des "wrappers javascript", ce qui signifie qu'elles essaient d'implémenter les fonctions LINQ de la manière c #. Par exemple, en regardant linq.js, elles ont un dictionnaire qui, pour le getter, effectue une recherche linéaire. L'objet de Javascript EST UN DICTIONNAIRE avec performances supérieures, mais à la place, ils ont implémenté GetHashCodes, etc.
George Mavritsakis
4
La particularité de LINQ est l'évaluation paresseuse. Underscore.js n'a pas cette fonctionnalité. Cependant, il existe lodash qui est un sur-ensemble de traits de soulignement, fonctionne mieux et prend en charge l'évaluation paresseuse sur les méthodes chaînées: var arr = _.range (1000); _ (arr) .map (fonction (v) {retour v + 1;}). filter (fonction (v) {retour v% 2;}). take (100) .value ();
srgstm
3
Oui ... cela a été écrit il y a quelque temps; Je recommanderais probablement lodash maintenant aussi. J'ai envisagé de bifurquer UnderscoreKO pour permettre le lodash. Mais je ne suis pas sûr d'être d'accord que l'évaluation paresseuse est "la" caractéristique distinctive de LINQ. La plupart du temps, mon appréciation de LINQ est qu'il communique généralement mieux l'intention que les autres façons de faire les choses. Juste une pensée. En tout cas, les deux bonnes bibliothèques.
Matthew Nichols
4

Je trouve personnellement les opérations LINQ / set Union, Intersect, Except et Distinct sur les énumérables dans .NET. très utile. Il existe un plugin jquery appelé jQuery Array Utilities qui fournit ces méthodes à utiliser sur les tableaux.

Exemples de code:

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

renvoie [1,2,3]

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

renvoie [1,2,3,4,5]

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

renvoie [2,3]

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

renvoie [1, 2]

Kristian Abrahamsen
la source
Ce paquet jquery-array-utilities peut également être installé en utilisant bower . Je voudrais ajouter une clause de non-responsabilité selon laquelle j'ai initialement créé le plugin :)
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
Janus Troelsen
la source
2

Il existe des bibliothèques de duplication qui tentent de porter LINQ vers JavaScript avec une syntaxe et des noms de méthode similaires. Cependant, dans la communauté JS, la bibliothèque qui devient vraiment populaire et qui fournit les mêmes fonctionnalités est Underscore.js .

orad
la source
2

J'ai essayé la plupart d'entre eux - et j'aime vraiment $ linq: http://jscriptlinq.codeplex.com/ le meilleur. Cela fonctionne simplement comme vous vous attendez à ce que c # linq fonctionne - y compris la capacité de chaîne.

user302084
la source
1

Je cherche moi-même quelque chose comme ça et je suis tombé sur ...

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

Cela a l'air vraiment génial! Peut-être que je ne comprends tout simplement pas l'intérêt de Rx et des observables par rapport à la définition de gestionnaires d'événements via quelque chose comme jQuery.

Jacob Thomason
la source
0

J'ai récemment créé une bibliothèque LINQ pour JavaScript. Il a implémenté la plupart des fonctions LINQ fournies par .NET et c'est la plus rapide de toutes les bibliothèques LINQ.

http://fromjs.codeplex.com/

suckgamony
la source