Jaka jest wiodąca biblioteka LINQ dla JavaScript? [Zamknięte]

95

Szukam biblioteki JavaScript, która pozwoli mi wykonywać zapytania dotyczące złożonych obiektów JSON przy użyciu składni podobnej do LINQ. Szybkie wyszukiwanie znalazło kilka obiecujących opcji, które wyglądały, że mogą oferować to, czego potrzebuję:

LINQ to JavaScript i jLinq

  • Czy ktoś ma jakieś doświadczenie w ich używaniu?
  • Jakie są zalety i wady?
  • Czy wydajność jest porównywalna?
  • Czy składnia przekazywania funkcji LINQ to JavaScript oferuje jakieś ukryte korzyści (osobiście uważam składnię jLinq za bardziej atrakcyjną na pierwszy rzut oka)?
  • Czego brakuje w obu projektach?
  • Czy kiedykolwiek próbowałeś skontaktować się z autorami? Jak reagowali?
  • Jaki projekt jest szerzej stosowany?

Myślę, że będzie to pierwszy, który zostanie dokładnie wypróbowany.

Tom Tresansky
źródło
Właśnie wydałem projekt open source jinqJs.com, który powinien ci pomóc.
NYTom
Wypróbuj LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Wszystkie metody LINQ z tą samą składnią C #. Zaimplementowano ten sam .NET LINQ do specyfikacji obiektów.
Yaser Moradi
Wydałem dinqyjs.com kilka lat temu, ma składnię podobną do Linq i wiele funkcji.
garryp
2
To pytanie jest stary i słusznie zamknięte, ale dla czytelników, którzy się po niej, główne cechy LINQ (filtrowanie, transformujące i agregujące) mogą być wykonywane za pomocą wbudowanego filter, maporaz reducefunkcji tablicowych. Nowa składnia lambda sprawia, że ​​kod wygląda bardziej podobnie do kodu LINQ.
jpmc26
Kilka miesięcy temu wydałem Linq-Collections( npmjs.com/package/linq-collections ). Wykorzystuje odroczone wykonania i mnóstwo wewnętrznych optymalizacji, aby działać błyskawicznie. W oparciu o standard Microsoftu (jeśli znasz C # Linq, to ​​znasz linq-collections)
Ivan Sanz-Carasa

Odpowiedzi:

13

Czy widziałeś już Rx dla Javascript ? To jest to czego chcesz.

Richard Anthony Hein
źródło
2
Miałem zamiar to zasugerować, ale tak naprawdę nie jest to to samo, co linq do obiektów. (Gdyby tak było, dlaczego mielibyśmy potrzebować zarówno Rx, jak i Linq do obiektów w .NET?) Działa w kierunku przeciwnym do normalnego Linq pod względem przepływu danych.
Daniel Earwicker
25
Nienawidzę, że jest to akceptowana odpowiedź. Jasne, z naukowego punktu widzenia interesujące jest to, że obserwowalne w .NET są podobne do wyliczalnych, ale co z tego? Prawie nikt, kto znajdzie to pytanie, faktycznie nie chce RX / obserwabli (są już o wiele bardziej przydatne implementacje tego w knockout, angularjs itp.), A sama odpowiedź nie próbuje nawet wyjaśnić, jakie jest znaczenie, a nawet jeśli tak było naprawdę najwłaściwszy wybór, raczej nie jest „wiodący” - ma około 1/5 pobrań linq.js.
Aaronaught
2
@Aaronaught Odpowiedź została udzielona ponad 3 lata temu i sytuacja zdecydowanie się zmieniła, a linq.js znacznie wyprzedza to, co było wtedy. W tamtym czasie uważałem, że rx.js był najlepszym rozwiązaniem do wykonywania operacji LINQ z JS, ponieważ inne biblioteki nie były świetne lub niekompletne, a RX miał pełnoetatowych programistów nad tym pracujących. Async była również ważna i nadal jest, IMO, w JavaScript - co jest tym, co otrzymujesz dzięki Observables. Na koniec, zauważmy, że Observables w Rx bardzo różnią się od Knockout i AngularJS Observables i służą różnym celom. Twoje opinie są odnotowywane i możesz głosować! :)
Richard Anthony Hein
2
@Aaronaught Jeszcze jedna uwaga ... jeśli ktoś szuka bibliotek powiązanych z LINQ dla JavaScript, to zdecydowanie powinien wiedzieć o Rx, ponieważ jest to w 100% LINQ, a znajomość LINQ, ale nie Rx, tak naprawdę zna tylko połowę historii. Twoje zdrowie.
Richard Anthony Hein
2
Mając duże doświadczenie z RX, Linq i JavaScript, mogę bez wahania powiedzieć, że ktoś, kto szuka bibliotek podobnych do Linq dla JavaScript, zdecydowanie nie musi wiedzieć o RX, a to tylko połowa historii, jeśli konkretnie zdefiniujesz „historię” być w połowie RX. Twierdzenie, że jest inaczej, powoduje mętnienie wód i utrudnia osobom o prostych wymaganiach zrozumienie dostępnych opcji. To tak, jakby powiedzieć komuś, kto szuka roweru, że najpierw musi dowiedzieć się czegoś o motocyklach; z pewnością związek jest interesujący, ale niezbyt przydatny w kontekście.
Aaronaught,
71

Może chcesz sprawdzić linq.js . Jest zgodny ze składnią lambda .NET i wygląda na dobrze zintegrowany ze środowiskiem Microsoft.

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

Plusy

  • Implementuje wszystkie metody .NET 4.0
  • Kompletna leniwa ocena
  • Pełna obsługa technologii IntelliSense dla VisualStudio
  • Obsługuje jQuery
  • Obsługuje hosta skryptów systemu Windows
  • Powiązanie dla reaktywnych rozszerzeń dla JavaScript (RxJS) i generatora IntelliSense
  • Obsługa instalacji NuGet
  • Zaktualizowano niedawno (ostatnie wydanie styczeń 2011)
  • Składnia jest zgodna ze składnią lambda w języku C #

Cons

  • Biblioteka linq.js jest trochę duża.
  • Jeśli korzystasz już z jQuery lub innej biblioteki js, najczęściej używana funkcjonalność jest już prawdopodobnie dostępna. Zobacz zwłaszcza filtr jQuery i metody „Dowolne”.
Nathan Palmer
źródło
2
Właśnie znalazłem porównanie wydajności kilku bibliotek podobnych do linq: danieltao.com/lazy.js/comparisons.html
Alexey F
Plik def Typescript jest GORĄCY!
kevp
1
@AlexeyF Nie masz jednak linq.js?
Alex
33

Najbardziej podstawowe i najczęściej używane operatory Linq są bardzo powszechnie definiowane w powszechnie używanych bibliotekach JS. Mają po prostu inne nazwy (w rzeczywistości mają bardziej tradycyjne nazwy niż w Linq). Selectstaje map, Wherestaje się filter, Firsti FirstOrDefaultstać [0].

Prawie żadna znana mi biblioteka (w tym myślę, że te, z którymi się łączyłeś) nie zadaje sobie trudu, aby implementacja była leniwa, jak w .NET Linq, po prostu oceniają natychmiast przy użyciu tablic.

Aby uzyskać bardzo ładny, kompletny zestaw operacji na liście funkcji, spróbuj: http://osteele.com/sources/javascript/functional/

Daniel Earwicker
źródło
Znajomość LINQ i zachowanie takiej samej składni byłoby ogromną pomocą. Leniwe ładowanie nie jest problemem. Wygląda na to, że ma wszystkie potrzebne funkcje, ale będę musiał trochę poeksperymentować. Na razie pozostawiam to pytanie otwarte, w nadziei, że ktoś natknie się na osobę, która korzystała z bibliotek JavaScript LINQ i podzieli się swoimi doświadczeniami. Po jakimś czasie, jeśli nikt inny tego nie zrobi, na pewno udzielę Ci odpowiedzi.
Tom Tresansky
25
@Tom - Mam tendencję do bycia ostrożnym wobec bibliotek, które próbują symulować doświadczenie używania języka X w języku Y, jeśli istnieje już dobry sposób na zrobienie tego samego w języku Y. Myślę, że lepiej jest nauczyć się „idiomów” "języka Y. Ludzie pisali operatory sekwencji funkcjonalnej w JS, zanim pojawił się Linq, aw JS zachowali" tradycyjne "nazwy i podejścia Lispy, więc teraz jest to bardziej styl JS. Więc mówię "Kiedy w Rzymie ..." Nawet do tego stopnia, jak układam nawiasy klamrowe, które ustawiają się pionowo w C #, ale w JS i Javie umieszczam pierwszy w tej samej linii itd.
Daniel Earwicker
2
Bardzo przydatna odpowiedź - zwłaszcza że „wybierz” mapy do „mapy”. W takim przypadku można użyć również
underscore.js
1
A co z połączeniem dwóch tablic? Próbowałem dowiedzieć się, jak uzyskać elementy tablicy A, których nie ma w tablicy B, ale wydaje się, że nie ma na to sposobu w JQuery. W LINQ jest to dość trywialne.
Noel Abrahams
@Noel Abrahams - dlaczego by nie skorzystać z metod ES5 Array zamiast jQuery? np.a1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker
10

Polecam przyjrzeć się underscore.js . Nie jest to bezpośredni port LINQ, jak niektóre inne, ale jest bardzo wygodnym doświadczeniem podobnym do LINQ. Obsługuje wszystkie potrzebne mi opcje filtrowania, sortowania i projektów oraz ma doskonałą dokumentację i wsparcie społeczności.

Jako bonus dla użytkowników Knockouta , istnieje UnderscoreKO, który dodaje metody tablicowe Underscore do obserwowalnych tablic Knockouta. Próbny

Matthew Nichols
źródło
3
Zdecydowanie sugerowałbym również podkreślenie. Niestety we wszystkich dostępnych bibliotekach brakuje wydajności. Jako programista ac # chciałbym mieć składnię C # z biblioteką zorientowaną na JavaScript, ale nie ma takiej dostępnej. Wszystkie wyżej wymienione biblioteki są „opakowaniami javascript”, co oznacza, że ​​próbują zaimplementować funkcje LINQ w sposób c #. Na przykład, patrząc na linq.js, mają słownik, który dla metody pobierającej wykonuje wyszukiwanie liniowe. Obiekt JavaScript JEST SŁOWNIK z lepsza wydajność, ale zamiast tego zaimplementowali GetHashCodes itp.
George Mavritsakis
4
Charakterystyczną cechą LINQ jest leniwa ocena. Underscore.js nie ma takiej funkcjonalności. Istnieje jednak lodash, który jest nadzbiorem podkreślenia, działa lepiej i obsługuje leniwą ocenę metod połączonych: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm
3
Tak ... to zostało napisane jakiś czas temu; Prawdopodobnie poleciłbym teraz również lodash. Rozważałem rozwidlenie UnderscoreKO, aby dopuścić lodash. Ale nie jestem pewien, czy zgadzam się, że leniwa ocena to „Cecha wyróżniająca” LINQ. Przede wszystkim doceniam LINQ za to, że zazwyczaj przekazuje intencje lepiej niż alternatywne sposoby robienia rzeczy. Tylko myśl. W każdym razie obie dobre biblioteki.
Matthew Nichols,
4

Osobiście znajduję operacje LINQ / set Union, Intersect, Except i Distinct na wyliczalnych w .NET. bardzo przydatne. Istnieje wtyczka jquery o nazwie jQuery Array Utilities, która zapewnia te metody do użycia w tablicach.

Przykłady kodu:

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

zwraca [1, 2, 3]

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

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

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

zwraca [2,3]

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

zwraca [1, 2]

Kristian Abrahamsen
źródło
Ten pakiet jquery-array-utilities można również zainstalować przy użyciu bower . Chciałbym dodać zastrzeżenie, że oryginalnie zrobiłem wtyczkę :)
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
źródło
2

Istnieje kilka powielających się bibliotek, które próbują przenieść LINQ do JavaScript przy użyciu podobnej składni i nazw metod. Jednak w społeczności JS biblioteką, która staje się bardzo popularna i zapewnia tę samą funkcjonalność, jest Underscore.js .

orad
źródło
2

Wypróbowałem większość z nich - i naprawdę lubię $ linq: http://jscriptlinq.codeplex.com/ the best. Po prostu działa tak, jak można by oczekiwać, że C # linq będzie działać - w tym zdolność łańcucha.

user302084
źródło
1

Sam czegoś takiego szukam i trafiłem na ...

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

To wygląda naprawdę świetnie! Może po prostu nie rozumiem sensu Rx i obserwałów w porównaniu do ustawiania programów obsługi zdarzeń przez coś takiego jak jQuery.

Jacob Thomason
źródło
0

Niedawno stworzyłem bibliotekę LINQ dla JavaScript. Zaimplementował większość funkcji LINQ dostarczonych przez .NET i jest najszybszą ze wszystkich bibliotek LINQ.

http://fromjs.codeplex.com/

suckgamony
źródło