Qual è la principale libreria LINQ per JavaScript? [chiuso]


95

Sto cercando una libreria JavaScript che mi consenta di eseguire query su oggetti JSON complessi utilizzando una sintassi simile a LINQ. Una rapida ricerca ha trovato un paio di opzioni promettenti che sembrano offrire ciò di cui ho bisogno:

LINQ to JavaScript e jLinq

  • Qualcuno ha esperienza nell'usarli?
  • Quali sono alcuni pro e contro?
  • Le prestazioni sono paragonabili?
  • La sintassi di passaggio di funzioni da LINQ a JavaScript offre vantaggi nascosti (personalmente trovo la sintassi di jLinq più interessante a prima vista)?
  • Cosa hai trovato che manca in entrambi i progetti?
  • Hai mai provato a contattare gli autori? Quanto erano reattivi?
  • Quale progetto è più ampiamente utilizzato?

Penso che sarà il primo a fare una prova approfondita.


Ho appena rilasciato il progetto open source jinqJs.com, che dovrebbe aiutarti.
NYTom

Prova LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Tutti i metodi LINQ con la stessa sintassi C #. Implementato lo stesso .NET LINQ per le specifiche degli oggetti.
Yaser Moradi

Ho rilasciato dinqyjs.com un paio di anni fa, ha una sintassi simile a Linq e molte funzionalità.
garryp

2
Questa domanda è vecchio e giustamente chiuso, ma per i lettori che accadono attraverso esso, le caratteristiche principali di LINQ (filtraggio, trasformazione e aggregazione) possono essere eseguite utilizzando il costruito nel filter, mape reducefunzioni di matrice. La nuova sintassi lambda aiuta a rendere il codice molto più simile al codice LINQ.
jpmc26

Pochi mesi fa ho rilasciato Linq-Collections( npmjs.com/package/linq-collections ). Utilizza esecuzioni differite e tonnellate di ottimizzazioni interne per essere velocissimo. Basato sullo standard Microsoft (se conosci C # Linq, allora conosci linq-collections)
Ivan Sanz-Carasa

Risposte:


13

Hai già visto Rx per Javascript ? Questo è ciò che vuoi.


2
Stavo per suggerirlo ma non è proprio lo stesso di linq per gli oggetti. (Se lo fosse, perché avremmo bisogno sia di Rx che di Linq per gli oggetti in .NET?) Funziona nella direzione opposta al normale Linq in termini di flusso di dati.
Daniel Earwicker,

25
Odio che questa sia la risposta accettata. Sì, certo, è accademicamente interessante che gli osservabili in .NET siano simili agli enumerabili, ma allora? Quasi nessuno che trova questa domanda in realtà vuole RX / osservabili (ci sono già implementazioni molto più utili di quello in knockout, angularjs, ecc.) E la risposta stessa non cerca nemmeno di spiegare quale sia la rilevanza, e anche se lo fosse davvero la scelta più appropriata, difficilmente è "leader" - ha circa 1/5 dei download di linq.js.
Aaronaught

2
@Aaronaught La risposta è stata data oltre 3 anni fa e le cose sono decisamente cambiate e linq.js è ora molto più avanti di quello che era allora. A quel tempo, credevo che rx.js fosse la soluzione migliore per eseguire operazioni LINQ con JS, poiché le altre librerie non erano eccezionali o incomplete e RX aveva sviluppatori a tempo pieno che ci lavoravano. Inoltre, l'asincronia era importante e lo è ancora, IMO, in JavaScript, che è ciò che ottieni con Observables. Infine, nota che gli osservabili in Rx sono molto diversi da Knockout e AngularJS Observables e hanno scopi diversi. Le tue opinioni vengono annotate e sei libero di votare! :)
Richard Anthony Hein

2
@Aaronaught Un'altra nota ... se qualcuno sta cercando librerie correlate a LINQ per JavaScript, allora dovrebbe assolutamente conoscere Rx, poiché è LINQ al 100%, e conoscere LINQ ma non Rx significa conoscere solo metà della storia. Saluti.
Richard Anthony Hein

2
Avendo una vasta esperienza avuto con RX, Linq, e JavaScript, posso dire senza esitazione che qualcuno alla ricerca di Linq come librerie JavaScript sicuramente non non c'è da sapere su RX, ed è solo metà della storia, se si specifica definisce "la storia" essere metà RX. Affermare il contrario significa confondere le acque e rendere più difficile per le persone con requisiti semplici capire le proprie opzioni. È come dire a qualcuno che sta cercando una bicicletta che deve prima imparare a conoscere le moto; certo, la relazione è interessante, ma non particolarmente utile nel contesto.
Aaronaught

71

Si potrebbe voler controllare linq.js . Segue la sintassi .NET lambda e sembra essere ben integrato in un ambiente Microsoft.

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

Professionisti

  • Implementa tutti i metodi .NET 4.0
  • Valutazione pigra completa
  • Supporto completo di IntelliSense per VisualStudio
  • Supporta jQuery
  • Supporta Windows Script Host
  • Binding per Reactive Extensions per JavaScript (RxJS) e IntelliSense Generator
  • Supporto per l'installazione di NuGet
  • Aggiornato di recente (ultimo rilascio gennaio 2011)
  • La sintassi è conforme alla sintassi lambda in C #

Contro

  • La libreria linq.js è un po 'grande.
  • Se stai già utilizzando jQuery o un'altra libreria js, la funzionalità più comunemente utilizzata è probabilmente già disponibile. Vedi in particolare il filtro di jQuery e i metodi "Any".

2
Ho appena trovato il confronto delle prestazioni per diverse librerie simili a linq
Alexey F

Il file def dattiloscritto è CALDO!
kevp

1
@AlexeyF No linq.js però?
Alex

33

Gli operatori Linq più basilari e utilizzati di frequente sono definiti molto comunemente nelle librerie JS ampiamente utilizzate. Hanno solo nomi diversi (infatti, hanno nomi più tradizionali rispetto a Linq). Selectdiventa map, Wherediventa filter, Firste FirstOrDefaultdiventare [0].

Quasi nessuna libreria che conosco (comprese quelle a cui ti sei collegato) si preoccupa di rendere pigra l'implementazione come in .NET Linq, valutano immediatamente usando gli array.

Per un set molto bello e completo di operazioni sugli elenchi funzionali, prova: http://osteele.com/sources/javascript/functional/


Avere familiarità con LINQ, mantenere la stessa sintassi sarebbe di grande aiuto. Il caricamento lento non è un problema. Sembra che abbia tutte le funzionalità di cui ho bisogno, ma dovrò sperimentarne alcune. Per ora tengo aperta la domanda, nella speranza che qualcuno inciampi in chi ha utilizzato le librerie JavaScript LINQ e condivida le proprie esperienze. Dopo un po 'di tempo, se nessun altro lo fa, sarò sicuro di darti la risposta.
Tom Tresansky,

25
@ Tom - Tendo ad essere un po 'diffidente nei confronti delle biblioteche che tentano di simulare l'esperienza dell'uso del linguaggio X all'interno del linguaggio Y se esiste già un buon modo per fare la stessa cosa nel linguaggio Y. Penso che sia meglio imparare gli "idiomi "del linguaggio Y. Le persone scrivevano operatori di sequenza funzionale in JS prima che Linq uscisse, e in JS mantennero i nomi e gli approcci" tradizionali "di Lispy, quindi questo è lo stile più JS. Quindi dico "Quando a Roma ..." anche nella misura in cui dispongo le parentesi graffe, che si allineano verticalmente in C #, ma in JS e Java metto la prima sulla stessa riga, ecc.
Daniel Earwicker

2
Risposta molto utile, in particolare quella "seleziona" mappe su "mappa". In tal caso, potrebbe essere utilizzato anche
underscore.js

1
Che ne dici di unire due array? Stavo cercando di capire come ottenere gli elementi dell'array A che non sono nell'array B, ma non sembra esserci un modo per farlo in JQuery. È abbastanza banale in LINQ.
Noel Abrahams

@ Noel Abrahams - per questo genere di cose perché non utilizzare i metodi ES5 Array invece di jQuery? ad esempioa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

Consiglio di dare un'occhiata a underscore.js . Non è una porta LINQ diretta come alcune delle altre, ma è un'esperienza "simile a LINQ" molto confortevole. Supporta tutte le opzioni di filtro, ordinamento e progetto di cui ho bisogno e ha un'eccellente documentazione e supporto della comunità.

Come bonus per gli utenti Knockout , c'è UnderscoreKO che aggiunge i metodi di array di Underscore agli array osservabili di Knockout. Demo


3
Suggerirei definitivamente anche la sottolineatura. Purtroppo tutte le librerie disponibili mancano di prestazioni. Essendo io stesso uno sviluppatore ac #, mi piacerebbe avere la sintassi c # con una libreria orientata a javascript ma non ce n'è alcuna disponibile. Tutte le suddette librerie sono "wrapper javascript", il che significa che cercano di implementare le funzioni LINQ in modo c #. Ad esempio, guardando linq.js hanno un dizionario che, per il getter, esegue una ricerca lineare. L'oggetto di Javascript È UN DIZIONARIO con prestazioni superiori ma invece hanno implementato GetHashCodes ecc.
George Mavritsakis

4
La caratteristica distintiva di LINQ è la valutazione lenta. Underscore.js non dispone di questa funzionalità. Tuttavia, esiste lodash che è un superset di underscore, funziona meglio e supporta la valutazione pigra sui metodi concatenati: var arr = _.range (1000); _ (arr) .map (funzione (v) {return v + 1;}). filter (funzione (v) {return v% 2;}). take (100) .value ();
srgstm

3
Sì ... questo è stato scritto tempo fa; Probabilmente consiglierei anche lodash ora. Ho pensato di biforcare UnderscoreKO per consentire il lodash. Ma non sono sicuro di essere d'accordo sul fatto che la valutazione lenta sia "La" caratteristica distintiva di LINQ. Principalmente il mio apprezzamento per LINQ è che in genere comunica l'intento meglio dei modi alternativi di fare le cose. Solo un pensiero. In ogni caso entrambe buone biblioteche.
Matthew Nichols

4

Personalmente trovo le operazioni LINQ / set Union, Intersect, Except e Distinct su enumerables in .NET. molto utile. C'è un plugin jquery chiamato jQuery Array Utilities che fornisce questi metodi da utilizzare sugli array.

Esempi di codice:

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

restituisce [1,2,3]

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

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

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

restituisce [2,3]

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

restituisce [1, 2]


Questo pacchetto jquery-array-utilities può essere installato anche utilizzando bower . Vorrei aggiungere un disclaimer che ho originariamente creato per il 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

2

Esistono alcune librerie di duplicazione che tentano di portare LINQ su JavaScript con una sintassi e nomi di metodo simili. Tuttavia, nella comunità JS, la libreria che sta diventando molto popolare e che fornisce le stesse funzionalità è Underscore.js .


2

Ho provato la maggior parte di questi - e mi piace molto $ linq: http://jscriptlinq.codeplex.com/ il migliore. Funziona semplicemente nel modo in cui ci si aspetterebbe che funzioni c # linq, inclusa la capacità della catena.



0

Di recente ho creato una libreria LINQ per JavaScript. Ha implementato la maggior parte delle funzioni LINQ fornite da .NET ed è la più veloce di tutte le librerie LINQ.

http://fromjs.codeplex.com/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.