Що є провідним LINQ для бібліотеки JavaScript? [зачинено]


95

Я шукаю бібліотеку JavaScript, яка дозволить мені запитувати складні об'єкти JSON, використовуючи синтаксис, подібний до LINQ. Швидкий пошук знайшов кілька перспективних варіантів, які, здається, можуть запропонувати те, що мені потрібно:

LINQ до JavaScript та jLinq

  • Хтось має досвід їх використання?
  • Які є плюси і мінуси?
  • Порівняльна продуктивність?
  • Чи надає функція передачі синтаксису LINQ до JavaScript якісь приховані переваги (я особисто вважаю синтаксис jLinq більш привабливим на перший погляд)?
  • Чого вам не вистачає в жодному з проектів?
  • Ви коли-небудь намагалися зв’язатися з авторами? Наскільки чуйними вони були?
  • Який проект використовується ширше?

Думаю, це буде перша, яка отримає ґрунтовну спробу.


Я щойно випустив проект з відкритим кодом jinqJs.com, який повинен вам допомогти.
Нью-Йорк,

Спробуйте LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Усі методи LINQ з однаковим синтаксисом C #. Реалізовано той самий .NET LINQ до специфікацій об'єктів.
Yaser Moradi

Я випустив dinqyjs.com пару років тому, має Linq-подібний синтаксис і багато функціональних можливостей.
garryp

2
Це питання старий і правильно закриті, але для читачів , які відбуваються через нього, основні особливості LINQ (фільтрація, трансформують і агрегування) можуть бути виконані з допомогою вбудованого filter, mapі reduceфункції масиву. Новий лямбда-синтаксис допомагає зробити код більш схожим на код LINQ.
jpmc26,

Кілька місяців тому я випустив Linq-Collections( npmjs.com/package/linq-collections ). Він використовує відкладені виконання та безліч внутрішніх оптимізацій, щоб швидко спалахнути. На основі стандарту Microsoft (якщо ви знаєте C # Linq, тоді ви знаєте колекції linq)
Іван Санц-Караса

Відповіді:


13

Ви вже бачили Rx для Javascript ? Це те, що ти хочеш.


2
Я збирався запропонувати це, але це насправді не те саме, що посилання на об'єкти. (Якщо це було так, навіщо нам потрібні як Rx, так і Linq для Об'єктів у .NET?) Він працює у зворотному напрямку до звичайного Linq з точки зору потоку даних.
Даніель Ервікер

25
Ненавиджу, що це прийнята відповідь. Так, звичайно, академічно цікаво, що спостережувані в .NET подібні до перераховуваних, але що? Майже ніхто, хто знаходить це питання, насправді не хоче RX / спостережуваних (вже є набагато корисніші реалізації цього в нокауті, angularjs тощо), а сама відповідь навіть не намагається пояснити, наскільки актуальна, і навіть якщо вона була насправді найбільш підходящий вибір, він навряд чи є "провідним" - у нього близько 1/5 завантажень linq.js.
Aaronaught

2
@Aaronaught Відповідь була дана більше 3 років тому, і речі точно змінилися, і linq.js зараз значно випереджає те, що було тоді. На той час я вважав, що rx.js є найкращим варіантом для здійснення операцій LINQ з JS, оскільки інші бібліотеки не були чудовими або неповними, і над ними працювали штатні розробники. Крім того, асинхронізація була важливою, і все ще є, IMO, в JavaScript - це те, що ви отримуєте з Observables. Нарешті, зауважте, спостережувані в Rx сильно відрізняються від спостережливих Knockout та AngularJS і служать різним цілям. Ваші думки зазначені, і ви можете голосувати! :)
Річард Ентоні Хайн

2
@Aaronaught Ще одне зауваження ... якщо хтось шукає бібліотеки, пов’язані з LINQ, для JavaScript, то вони неодмінно повинні знати про Rx, оскільки це 100% LINQ, і знати LINQ, але не Rx, насправді знає лише половину історії. Ура.
Річард Ентоні Хайн

2
Отримавши великий досвід роботи з RX, Linq та JavaScript, я без вагань можу сказати, що хтось, хто шукає подібні до Linq бібліотеки для JavaScript, точно не повинен знати про RX, і це лише половина історії, якщо ви конкретно визначите "історію" бути наполовину RX. Стверджувати інакше - це каламутність води і ускладнення для людей з простими вимогами розуміння своїх варіантів. Це все одно, що сказати тому, хто шукає велосипед, що спочатку потрібно дізнатись про мотоцикли; звичайно, стосунки цікаві, але не особливо корисні в контексті.
Aaronaught

71

Ви можете перевірити linq.js . Він дотримується лямбда-синтаксису .NET і, схоже, добре інтегрований у середовище Microsoft.

LINQ для JavaScript - http://linqjs.codeplex.com/

Плюси

  • Реалізує всі методи .NET 4.0
  • Повна ледача оцінка
  • Повна підтримка IntelliSense для VisualStudio
  • Підтримує jQuery
  • Підтримує Windows Script Host
  • Прив'язка для реактивних розширень для JavaScript (RxJS) та генератора IntelliSense
  • Підтримка встановлення NuGet
  • Оновлено нещодавно (останній випуск січня 2011 р.)
  • Синтаксис відповідає синтаксису лямбда в C #

Мінуси

  • Бібліотека linq.js трохи велика.
  • Якщо ви вже використовуєте jQuery або іншу бібліотеку js, можливо, найбільш часто використовувана функціональність вже доступна. Див. Особливості фільтра jQuery та методів "Any".

2
Щойно знайшов порівняння продуктивності для декількох подібних до linq бібліотек: danieltao.com/lazy.js/comparisons.html
Олексій Ф,

Файл defs Typescript є ГАРЯЧИМ!
kevp

1
@AlexeyF Хоча немає linq.js?
Алекс

33

Найбільш основні та часто використовувані оператори Linq дуже часто визначаються у широко використовуваних бібліотеках JS. Вони просто мають різні імена (насправді вони мають більше традиційних імен, ніж у Linq). Selectстає map, Whereстає filter, Firstі FirstOrDefaultстати [0].

Майже жодна бібліотека, про яку я знаю (включаючи, на мою думку, і ті, з якими ви пов’язували), не намагається зробити реалізацію лінивою, як у .NET Linq, вони просто оцінюють негайно за допомогою масивів.

Для дуже приємного, повного набору функціональних операцій зі списком спробуйте: http://osteele.com/sources/javascript/functional/


Знайомство з LINQ, дотримання якомога більшої кількості синтаксису було б величезною допомогою. Ледаче навантаження не турбує. Здається, він має всю необхідну функціональність, але мені доведеться поекспериментувати. Наразі я залишаю це питання відкритим, сподіваючись, хтось натрапить на те, хто використовував бібліотеки JavaScript LINQ та ділився своїм досвідом. Через деякий час, якщо цього не зробить ніхто інший, я обов’язково дам вам відповідь.
Том Тресанський

25
@Tom - Я, як правило, трохи обережний щодо бібліотек, які намагаються імітувати досвід використання мови X всередині мови Y, якщо вже існує хороший спосіб зробити те саме в мові Y. Я думаю, що краще вивчити "ідіоми "мови Y. Люди писали оператори функціональної послідовності в JS ще до виходу Linq, і в JS вони зберігали" традиційні "імена та підходи Ліспі, тому це зараз більше стиль JS. Тож я кажу: "Коли в Римі ..." Навіть у міру того, як я викладаю фігурні дужки, які вертикально вирівнюються в C #, але в JS та Java я ставлю перший на одному рядку тощо.
Даніель Ервікер

2
Дуже корисна відповідь - особливо, що "вибрати" карти на "карту". У цьому випадку також міг бути використаний underscore.js
PandaWood

1
А як щодо об’єднання двох масивів? Я намагався зрозуміти, як отримати елементи масиву A, яких немає в масиві B, але, здається, немає способу зробити це в JQuery. Це досить тривіально в LINQ.
Ноель Абрахамс

@Noel Abrahams - для такого роду речі, чому б не використовувати методи ES5 Array замість jQuery? напр.a1.filter(function(e) { return a2.indexOf(e) == -1; })
Даніель Ервікер

10

Рекомендую поглянути на underscore.js . Це не прямий порт LINQ, як деякі інші, але дуже зручний досвід, схожий на LINQ. Він підтримує всі потрібні мені параметри фільтру, сортування та проектування та має чудову документацію та підтримку спільноти.

Як бонус для користувачів Knockout існує UnderscoreKO, який додає методи масивів Underscore до спостережуваних масивів Knockout. Демо


3
Я б остаточно запропонував також підкреслити. На жаль, у всіх доступних бібліотеках не вистачає продуктивності. Будучи розробником ac #, я хотів би мати синтаксис c # з бібліотекою, орієнтованою на javascript, але такої можливості немає. Усі вищезазначені бібліотеки є "обгортками javascript", що означає, що вони намагаються реалізувати функції LINQ способом c #. Наприклад, дивлячись на linq.js, вони мають Словник, який для геттера здійснює лінійний пошук. Об'єкт Javascript - СЛОВНИК із чудова продуктивність, але замість цього вони запровадили GetHashCodes тощо
Джордж Мавріцакіс

4
Відмінною рисою LINQ є лінива оцінка. Underscore.js не має цієї функціональності. Однак існує lodash, який є надмножинням підкреслення, працює ефективніше і підтримує ледачу оцінку за ланцюговими методами: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm

3
Так ... це було написано деякий час тому; Я б, напевно, також рекомендував зараз лодаш. Я розглядав можливість вилучити UnderscoreKO, щоб дозволити лодаш. Але я не впевнений, що погоджуюсь, що ліниве оцінювання - це "відмінна риса LINQ". В основному я вдячний LINQ за те, що він, як правило, передає наміри краще, ніж альтернативні способи здійснення дій. Просто думка. У кожному разі обидві хороші бібліотеки.
Метью Ніколс

4

Я особисто знаходжу операції LINQ / set операцій Union, Intersect, Osim та Distinct на перечислимих в .NET. дуже корисний. Існує плагін jQuery під назвою jQuery Array Utilities, який надає ці методи для використання в масивах.

Приклади коду:

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

повертає [1,2,3]

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

повертається [1,2,3,4,5]

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

повертає [2,3]

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

повертає [1, 2]


Цей пакет jquery-array-utilities також можна встановити за допомогою bower . Я хотів би додати застереження про те, що я спочатку зробив плагін :)
Крістіан Абрахамсен

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

Є кілька дублюючих бібліотек, які намагаються перенести LINQ на JavaScript із подібним синтаксисом та іменами методів. Однак у спільноті JS бібліотекою, яка стає по-справжньому популярною та забезпечує однакову функціональність, є Underscore.js .


2

Я випробував більшість із них - і мені дуже подобається $ linq: http://jscriptlinq.codeplex.com/ найкраще. Це просто працює так, як ви очікуєте, що c # linq працюватиме, включаючи здатність ланцюжка.


1

Я сам шукаю щось подібне і натрапив ...

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

Це виглядає дійсно чудово! Можливо, я просто не розумію сенс Rx та спостережуваних порівняно із встановленням обробників подій через щось на зразок jQuery.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.