¿Cuál es la biblioteca líder de LINQ para JavaScript? [cerrado]

95

Estoy buscando una biblioteca de JavaScript que me permita consultar objetos JSON complejos utilizando una sintaxis similar a LINQ. Una búsqueda rápida encontró un par de opciones prometedoras que parecen ofrecer lo que necesito:

LINQ a JavaScript y jLinq

  • ¿Alguien tiene alguna experiencia usándolos?
  • ¿Cuáles son algunos pros y contras?
  • ¿Es comparable el rendimiento?
  • ¿La sintaxis de transferencia de funciones de LINQ to JavaScript ofrece algún beneficio oculto (personalmente, encuentro la sintaxis de jLinq más atractiva a primera vista)?
  • ¿Qué le ha faltado a ambos proyectos?
  • ¿Intentó alguna vez ponerse en contacto con los autores? ¿Qué tan receptivos fueron?
  • ¿Qué proyecto se utiliza más?

Creo que será el primero en hacer una prueba completa.

Tom Tresansky
fuente
Acabo de lanzar el proyecto de código abierto jinqJs.com, que debería ayudarte.
NYTom
Pruebe LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Todos los métodos LINQ con la misma sintaxis de C #. Se implementó el mismo .NET LINQ para las especificaciones de objetos.
Yaser Moradi
Lancé dinqyjs.com hace un par de años, tiene una sintaxis similar a Linq y mucha funcionalidad.
garryp
2
Esta pregunta es viejo y con razón cerrada, pero para los lectores que pasan a través de ella, las principales características de LINQ (filtrado, transformación y agregación) se puede realizar utilizando el construido en filter, mapy reducefunciones de matriz. La nueva sintaxis lambda ayuda a que el código se vea mucho más similar al código LINQ.
jpmc26
Hace unos meses lancéLinq-Collections ( npmjs.com/package/linq-collections ). Utiliza ejecuciones diferidas y toneladas de optimizaciones internas para ser increíblemente rápido. Basado en el estándar de Microsoft (si conoce C # Linq, entonces conoce linq-collections)
Ivan Sanz-Carasa

Respuestas:

13

¿Ha visto Rx para Javascript , todavía? Eso es lo que quieres.

Richard Anthony Hein
fuente
2
Iba a sugerir esto, pero en realidad no es lo mismo que enlazar con objetos. (Si lo fuera, ¿por qué necesitaríamos tanto Rx como Linq para objetos en .NET?) Funciona en la dirección opuesta a Linq normal en términos del flujo de datos.
Daniel Earwicker
24
Odio que esta sea la respuesta aceptada. Sí, claro, es académicamente interesante que los observables en .NET sean similares a los enumerables, pero ¿y qué? Casi nadie que encuentre esta pregunta realmente quiere RX / observables (ya hay implementaciones mucho más útiles de eso en knockout, angularjs, etc.) y la respuesta en sí ni siquiera intenta explicar cuál es la relevancia, e incluso si fuera realmente la opción más apropiada, no es "líder" - tiene aproximadamente 1/5 de las descargas de linq.js.
Aaronaught
2
@Aaronaught La respuesta se dio hace más de 3 años, y las cosas definitivamente han cambiado, y linq.js ahora está muy por delante de lo que era en ese entonces. En ese momento, creía que rx.js era la mejor opción para realizar operaciones LINQ con JS, ya que las otras bibliotecas no eran excelentes ni estaban incompletas y RX tenía desarrolladores de tiempo completo trabajando en ello. Además, la async era importante y todavía lo es, en mi opinión, en JavaScript, que es lo que obtienes con Observables. Por último, tenga en cuenta que los Observables en Rx son muy diferentes de los Observables Knockout y AngularJS, y tienen diferentes propósitos. ¡Se anotan sus opiniones y puede votar! :)
Richard Anthony Hein
2
@Aaronaught Una nota más ... si alguien está buscando bibliotecas relacionadas con LINQ para JavaScript, definitivamente debería saber sobre Rx, ya que es 100% LINQ, y conocer LINQ pero no Rx es solo conocer la mitad de la historia. Salud.
Richard Anthony Hein
2
Habiendo tenido una amplia experiencia con RX, Linq y JavaScript, puedo decir sin dudarlo que alguien que busque bibliotecas tipo Linq para JavaScript definitivamente no necesita saber sobre RX, y es solo la mitad de la historia si define específicamente "la historia" ser mitad RX. Afirmar lo contrario está enturbiando las aguas y dificultando que las personas con requisitos simples comprendan sus opciones. Es como decirle a alguien que está buscando una bicicleta que primero debe aprender sobre motocicletas; seguro, la relación es interesante, pero no particularmente útil en contexto.
Aaronaught
71

Es posible que desee echa un vistazo a linq.js . Sigue la sintaxis lambda de .NET y parece estar bien integrado en un entorno de Microsoft.

LINQ para JavaScript: http://linqjs.codeplex.com/

Pros

  • Implementa todos los métodos de .NET 4.0
  • Evaluación perezosa completa
  • Soporte completo de IntelliSense para VisualStudio
  • Soporta jQuery
  • Soporta Windows Script Host
  • Enlace para extensiones reactivas para JavaScript (RxJS) e IntelliSense Generator
  • Soporte de instalación de NuGet
  • Actualizado recientemente (última versión en enero de 2011)
  • La sintaxis se ajusta a la sintaxis lambda en C #

Contras

  • La biblioteca linq.js es un poco grande.
  • Si ya está utilizando jQuery u otra biblioteca js, la funcionalidad más utilizada probablemente ya esté disponible. Vea especialmente el filtro de jQuery y los métodos 'Any'.
Nathan Palmer
fuente
2
Acabo de encontrar una comparación de rendimiento para varias bibliotecas tipo linq
Alexey F
¡El archivo de TypeScript def está CALIENTE!
kevp
1
@AlexeyF ¿Sin embargo, no linq.js?
Alex
33

Los operadores Linq más básicos y de uso frecuente se definen con mucha frecuencia en bibliotecas JS ampliamente utilizadas. Simplemente tienen nombres diferentes (de hecho, tienen nombres más tradicionales que en Linq). Selectse vuelve map, Wherevuelve filter, Firsty FirstOrDefaultconvertido [0].

Casi ninguna biblioteca que conozca (incluidas las que creo que vinculó) se molestan en hacer que la implementación sea lenta como en .NET Linq, simplemente evalúan inmediatamente usando matrices.

Para obtener un conjunto completo y muy agradable de operaciones de lista funcional, pruebe: http://osteele.com/sources/javascript/functional/

Daniel Earwicker
fuente
Estar familiarizado con LINQ y mantener la misma sintaxis sería de gran ayuda. La carga diferida no es una preocupación. Parece que tiene todas las funciones que necesito, pero tendré que experimentar algunas. Mantengo la pregunta abierta por ahora, con la esperanza de que alguien se tropiece con quien haya usado las bibliotecas LINQ de JavaScript y comparta sus experiencias. Después de que pase un tiempo, si nadie más lo hace, me aseguraré de darte la respuesta.
Tom Tresansky
25
@Tom - Tiendo a desconfiar un poco de las bibliotecas que intentan simular la experiencia de usar el lenguaje X dentro del lenguaje Y si ya existe una buena manera de hacer lo mismo en el lenguaje Y. Creo que es mejor aprender los "modismos" "del lenguaje Y. La gente estaba escribiendo operadores de secuencia funcional en JS antes de que apareciera Linq, y en JS mantenían los nombres y enfoques" tradicionales "de Lispy, por lo que ahora es el estilo más JS. Entonces digo "Cuando en Roma ..." Incluso en la medida en que coloco llaves, que se alinean verticalmente en C #, pero en JS y Java coloco la primera en la misma línea, etc.
Daniel Earwicker
2
Respuesta muy útil, especialmente que 'seleccione' mapas para 'mapa'. En ese caso, también se podría usar
underscore.js
1
¿Qué hay de unir dos matrices? Estaba tratando de averiguar cómo obtener los elementos de la matriz A que no están en la matriz B, pero no parece haber una forma de hacerlo en JQuery. Es bastante trivial en LINQ.
Noel Abrahams
@Noel Abrahams: para este tipo de cosas, ¿por qué no usar los métodos de matriz ES5 en lugar de jQuery? pa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker
10

Recomiendo echar un vistazo a underscore.js . No es un puerto LINQ directo como algunos de los otros, pero es una experiencia muy cómoda "similar a LINQ". Es compatible con todas las opciones de filtrado, clasificación y proyecto que necesito y tiene una excelente documentación y soporte de la comunidad.

Como beneficio adicional para los usuarios de Knockout , existe UnderscoreKO que agrega los métodos de matriz de Underscore a las matrices observables de Knockout. Manifestación

Matthew Nichols
fuente
3
Definitivamente sugeriría subrayar también. Desafortunadamente, todas las bibliotecas disponibles carecen de rendimiento. Siendo desarrollador de ac #, me encantaría tener la sintaxis de c # con una biblioteca orientada a javascript, pero no existe ninguna disponible. Todas las bibliotecas mencionadas anteriormente son "envoltorios de javascript", lo que significa que intentan implementar funciones LINQ de la forma c #. Por ejemplo, mirando linq.js tienen un Diccionario que, para el captador, hace una búsqueda lineal. El objeto de Javascript ES UN DICCIONARIO con rendimiento superior, pero en vez de eso implementadas GetHashCodes etc.
George Mavritsakis
4
La característica distintiva de LINQ es la evaluación perezosa. Underscore.js no tiene esta funcionalidad. Sin embargo, hay lodash que es un superconjunto de subrayado, funciona mejor y admite la evaluación diferida en métodos encadenados: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm
3
Sí ... esto fue escrito hace un tiempo; Probablemente también recomendaría lodash ahora. He estado considerando bifurcar UnderscoreKO para permitir lodash. Pero no estoy seguro de estar de acuerdo con que la evaluación perezosa sea "La" característica distintiva de LINQ. Principalmente, lo que aprecio por LINQ es que normalmente comunica mejor la intención que las formas alternativas de hacer las cosas. Solo un pensamiento. En cualquier caso, ambas buenas bibliotecas.
Matthew Nichols
4

Personalmente, encuentro las operaciones LINQ / set Union, Intersect, Except y Distinct en enumerables en .NET. muy útil. Existe un complemento de jquery llamado jQuery Array Utilities que proporciona estos métodos para su uso en matrices.

Ejemplos de código:

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

devuelve [1,2,3]

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

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

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

devuelve [2,3]

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

devuelve [1, 2]

Kristian Abrahamsen
fuente
Este paquete jquery-array-utilities también se puede instalar usando bower . Me gustaría agregar un descargo de responsabilidad de que originalmente hice el complemento :)
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
fuente
2

Existen algunas bibliotecas duplicadas que intentan portar LINQ a JavaScript con una sintaxis y nombres de métodos similares. Sin embargo, en la comunidad JS, la biblioteca que se está volviendo realmente popular y que proporciona la misma funcionalidad es Underscore.js .

orad
fuente
2

Probé la mayoría de estos, y realmente me gusta $ linq: http://jscriptlinq.codeplex.com/ el mejor. Simplemente funciona de la manera que esperaría que funcionara c # linq, incluida la capacidad de cadena.

user302084
fuente
1

Estoy buscando algo como esto yo mismo y encontré ...

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

¡Esto se ve realmente genial! Tal vez simplemente no entiendo el punto de Rx y observables en comparación con la configuración de controladores de eventos a través de algo como jQuery.

Jacob Thomason
fuente
0

Recientemente hice una biblioteca LINQ para JavaScript. Implementó la mayoría de las funciones LINQ proporcionadas por .NET y es la más rápida de todas las bibliotecas LINQ.

http://fromjs.codeplex.com/

suckgamony
fuente