Qual é a biblioteca LINQ para JavaScript líder? [fechadas]


95

Estou procurando uma biblioteca JavaScript que me permita consultar objetos JSON complexos usando uma sintaxe semelhante ao LINQ. Uma rápida pesquisa encontrou algumas opções promissoras que parecem oferecer o que preciso:

LINQ para JavaScript e jLinq

  • Alguém tem alguma experiência em usá-los?
  • Quais são alguns prós e contras?
  • O desempenho é comparável?
  • A sintaxe de passagem de função do LINQ to JavaScript oferece algum benefício oculto (pessoalmente, acho a sintaxe do jLinq mais atraente à primeira vista)?
  • O que você achou que falta em qualquer um dos projetos?
  • Você já tentou entrar em contato com os autores? Eles foram responsivos?
  • Qual projeto é mais amplamente utilizado?

Acho que será o primeiro a fazer um teste completo.


Acabei de lançar o projeto de código aberto jinqJs.com, que deve ajudá-lo.
NYTom

Experimente LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Todos os métodos LINQ com a mesma sintaxe C #. Implementado o mesmo .NET LINQ para especificações de objeto.
Yaser Moradi

Eu lancei o dinqyjs.com alguns anos atrás, tem uma sintaxe semelhante ao Linq e muitas funcionalidades.
garryp

2
Esta questão é velho e com razão fechados, mas para os leitores que acontecem em toda ela, as principais características do LINQ (filtragem, transformando e agregando) pode ser realizada utilizando o construído em filter, mape reducefunções de matriz. A nova sintaxe lambda ajuda a tornar o código muito mais semelhante ao código LINQ.
jpmc26

Há alguns meses, lanceiLinq-Collections ( npmjs.com/package/linq-collections ). Ele usa execuções adiadas e toneladas de otimizações internas para ser extremamente rápido. Baseado no padrão da Microsoft (se você conhece C # Linq, então conhece linq-Collections)
Ivan Sanz-Carasa

Respostas:


13

Você já viu Rx para Javascript ? Isso é o que você quer.


2
Eu ia sugerir isso, mas não é realmente o mesmo que linq para objetos. (Se fosse, por que precisaríamos de Rx e Linq para objetos no .NET?) Funciona na direção oposta ao Linq normal em termos de fluxo de dados.
Daniel Earwicker,

24
Eu odeio que esta seja a resposta aceita. Sim, claro, é academicamente interessante que os observáveis ​​no .NET sejam semelhantes aos enumeráveis, mas e daí? Quase ninguém que encontra esta questão realmente quer RX / observáveis ​​(já existem implementações muito mais úteis disso em knockout, angularjs, etc.) e a própria resposta nem mesmo tenta explicar qual é a relevância, e mesmo que fosse realmente a escolha mais apropriada, dificilmente é "líder" - tem cerca de 1/5 dos downloads de linq.js.
Aaronaught

2
@Aaronaught A resposta foi dada há mais de 3 anos e as coisas mudaram definitivamente, e o linq.js está agora muito à frente do que era naquela época. Na época, eu acreditava que rx.js era a melhor aposta para fazer operações LINQ com JS, já que as outras bibliotecas não eram ótimas ou estavam incompletas e o RX tinha desenvolvedores em tempo integral trabalhando nisso. Além disso, async era importante e ainda é, IMO, em JavaScript - que é o que você obtém com Observables. Finalmente, observe que os observáveis ​​em Rx são muito diferentes dos observáveis ​​Knockout e AngularJS e têm finalidades diferentes. Suas opiniões são anotadas e você está livre para votar! :)
Richard Anthony Hein

2
@Aaronaught Mais uma nota ... se alguém está procurando bibliotecas relacionadas ao LINQ para JavaScript, então definitivamente deve saber sobre Rx, já que é 100% LINQ, e conhecer LINQ, mas não Rx, é realmente saber apenas metade da história. Felicidades.
Richard Anthony Hein

2
Tendo tido vasta experiência com RX, Linq e JavaScript, posso dizer sem hesitação que alguém que procura bibliotecas do tipo Linq para JavaScript definitivamente não precisa saber sobre RX, e é apenas metade da história se você definir especificamente "a história" ser meio RX. Afirmar o contrário está turvando as águas e tornando mais difícil para as pessoas com requisitos simples compreenderem suas opções. É como dizer a alguém que está procurando uma bicicleta que precisa primeiro aprender sobre motocicletas; claro, o relacionamento é interessante, mas não particularmente útil no contexto.
Aaronaught

71

Você pode querer verificar para fora linq.js . Ele segue a sintaxe lambda do .NET e parece estar bem integrado em um ambiente Microsoft.

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

Prós

  • Implementa todos os métodos .NET 4.0
  • Avaliação completa preguiçosa
  • Suporte total a IntelliSense para VisualStudio
  • Suporta jQuery
  • Suporta Windows Script Host
  • Vinculação para extensões reativas para JavaScript (RxJS) e gerador de IntelliSense
  • Suporte de instalação NuGet
  • Atualizado recentemente (último lançamento em janeiro de 2011)
  • A sintaxe está em conformidade com a sintaxe lambda em C #

Contras

  • A biblioteca linq.js é um pouco grande.
  • Se você já estiver usando jQuery ou outra biblioteca js, a funcionalidade mais comumente usada provavelmente já está disponível. Veja especialmente o filtro do jQuery e os métodos 'Qualquer'.

2
Acabei de encontrar uma comparação de desempenho para várias bibliotecas semelhantes ao linq: danieltao.com/lazy.js/comparisons.html
Alexey F

O arquivo de definição de texto digitado está QUENTE!
kevp

1
@AlexeyF Sem linq.js, entretanto?
Alex,

33

Os operadores Linq mais básicos e usados ​​com frequência são comumente definidos em bibliotecas JS amplamente usadas. Eles apenas têm nomes diferentes (na verdade, eles têm nomes mais tradicionais do que no Linq). Selecttorna-se map, Wheretorna-se filter, Firste FirstOrDefaultse tornar [0].

Quase nenhuma biblioteca que conheço (incluindo as que você vinculou) se preocupou em tornar a implementação preguiçosa como no .NET Linq, eles apenas avaliam imediatamente usando matrizes.

Para obter um conjunto muito bom e completo de operações de lista funcional, tente: http://osteele.com/sources/javascript/functional/


Estar familiarizado com o LINQ, manter o máximo da sintaxe igual seria uma grande ajuda. O carregamento lento não é uma preocupação. Parece que tem todas as funcionalidades de que preciso, mas terei que experimentar algumas. Estou mantendo a questão em aberto por enquanto, na esperança de que alguém encontre quem usou as bibliotecas LINQ JavaScript e compartilhe suas experiências. Depois de algum tempo, se ninguém mais o fizer, com certeza te darei a resposta.
Tom Tresansky,

25
@Tom - tendo a ser um pouco cauteloso com bibliotecas que tentam simular a experiência de usar a linguagem X dentro da linguagem Y se já houver uma boa maneira de fazer a mesma coisa na linguagem Y. Acho que é melhor aprender os "idiomas "da linguagem Y. As pessoas estavam escrevendo operadores de sequência funcional em JS antes do Linq ser lançado, e em JS eles mantiveram os nomes e abordagens Lispy" tradicionais ", então agora é o estilo mais JS. Então eu digo "When in Rome ..." Até o ponto em que coloco as chaves, que se alinham verticalmente em C #, mas em JS e Java coloco o primeiro na mesma linha, etc.
Daniel Earwicker

2
Resposta muito útil - especialmente que 'selecionar' mapeia para 'mapear'. Nesse caso, o underscore.js também poderia ser usado
PandaWood de

1
Que tal juntar dois arrays? Eu estava tentando descobrir como obter os elementos do array A que não estão no array B, mas não parece haver uma maneira de fazer isso no JQuery. É bastante trivial no LINQ.
Noel Abrahams

@Noel Abrahams - para esse tipo de coisa, por que não usar os métodos de Array ES5 em vez de jQuery? por exemploa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

Eu recomendo dar uma olhada em underscore.js . Não é uma porta LINQ direta como algumas das outras, mas é uma experiência "semelhante ao LINQ" muito confortável. Ele oferece suporte a todas as opções de filtro, classificação e projeto de que preciso e possui excelente documentação e suporte da comunidade.

Como um bônus para os usuários do Knockout , existe o UnderscoreKO que adiciona métodos de array do Underscore aos arrays observáveis ​​do Knockout. Demo


3
Eu definitivamente sugeriria sublinhado também. Infelizmente, todas as bibliotecas disponíveis carecem de desempenho. Sendo eu mesmo um desenvolvedor ac #, adoraria ter a sintaxe c # com uma biblioteca orientada para javascript, mas não existe nenhuma disponível. Todas as bibliotecas mencionadas acima são "wrappers javascript", o que significa que tentam implementar funções LINQ da maneira c #. Por exemplo, olhando para linq.js, eles têm um Dicionário que, para o getter, faz uma pesquisa linear. O objeto Javascript É UM DICIONÁRIO com desempenho superior, mas em vez disso, eles implementaram GetHashCodes etc.
George Mavritsakis

4
A característica distintiva do LINQ é a avaliação preguiçosa. Underscore.js não tem essa funcionalidade. No entanto, existe o lodash, que é um superconjunto de sublinhado, tem melhor desempenho e oferece suporte para avaliação preguiçosa em métodos encadeados: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm

3
Sim ... isso foi escrito há pouco; Eu provavelmente recomendaria Lodash agora também. Tenho considerado a bifurcação de UnderscoreKO para permitir lodash. Mas não tenho certeza se concordo que a avaliação preguiçosa seja "A" característica distintiva do LINQ. Principalmente, minha apreciação do LINQ é que ele normalmente comunica melhor a intenção do que as formas alternativas de fazer as coisas. Apenas um pensamento. De qualquer forma, ambas boas bibliotecas.
Matthew Nichols

4

Eu pessoalmente acho as operações LINQ / set Union, Intersect, Except e Distinct em enumerables em .NET. muito útil. Existe um plugin jquery chamado jQuery Array Utilities que fornece esses métodos para serem usados ​​em arrays.

Exemplos de código:

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

retorna [1,2,3]

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

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

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

retorna [2,3]

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

retorna [1, 2]


Este pacote jquery-array-utilities também pode ser instalado usando o bower . Eu gostaria de adicionar um aviso de que originalmente fiz o 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

Existem algumas bibliotecas duplicadas que tentam portar LINQ para JavaScript com sintaxe e nomes de método semelhantes. No entanto, na comunidade JS, a biblioteca que está se tornando muito popular e fornecendo a mesma funcionalidade é Underscore.js .


2

Eu tentei a maioria deles - e realmente gosto de $ linq: http://jscriptlinq.codeplex.com/ o melhor. Ele simplesmente funciona da maneira que você esperaria que o c # linq funcionasse - incluindo a capacidade de encadear.


1

Estou procurando algo assim e me deparei com ...

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

Isso parece realmente ótimo! Talvez eu simplesmente não entenda o ponto de Rx e observáveis ​​em comparação com a configuração de manipuladores de eventos por meio de algo como jQuery.


0

Recentemente, fiz uma biblioteca LINQ para JavaScript. Ele implementou a maioria das funções LINQ fornecidas pelo .NET e é a mais rápida de todas as bibliotecas LINQ.

http://fromjs.codeplex.com/

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.