Какая библиотека LINQ для JavaScript является ведущей? [закрыто]

95

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

LINQ в JavaScript и jLinq

  • Есть ли у кого-нибудь опыт их использования?
  • Какие плюсы и минусы?
  • Сравнима ли производительность?
  • Предлагает ли синтаксис передачи функций LINQ to JavaScript какие-либо скрытые преимущества (я лично считаю синтаксис jLinq более привлекательным на первый взгляд)?
  • Чего вам не хватало в любом из проектов?
  • Вы когда-нибудь пробовали связаться с авторами? Насколько они отзывчивы?
  • Какой проект используется более широко?

Думаю, он будет первым, кто тщательно опробуется.

Том Тресанский
источник
Я только что выпустил проект с открытым исходным кодом jinqJs.com, который должен вам помочь.
NYTom
Попробуйте LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Все методы LINQ с одинаковым синтаксисом C #. Реализованы те же спецификации .NET LINQ to object.
Ясер Моради
Пару лет назад я выпустил dinqyjs.com, у него синтаксис, подобный Linq, и множество функций.
garryp
2
Этот вопрос стар и правильно закрыты, но для читателей , которые происходят через него, основные особенности LINQ (фильтрация, трансформирующие и агрегирование) могут быть выполнены с помощью встроенного filter, mapи reduceфункции массива. Новый синтаксис лямбда помогает сделать код более похожим на код LINQ.
jpmc26
Несколько месяцев назад я выпустил Linq-Collections( npmjs.com/package/linq-collections ). Он использует отложенное выполнение и множество внутренних оптимизаций, чтобы работать быстро. На основе стандарта Microsoft (если вы знакомы с C # Linq, значит, вы знаете linq-коллекции)
Иван Санс-Караса, 02

Ответы:

13

Вы уже видели Rx для Javascript ? Это то, что ты хочешь.

Ричард Энтони Хайн
источник
2
Я собирался предложить это, но на самом деле это не то же самое, что linq to objects. (Если бы это было так, зачем нам и Rx, и Linq to Objects в .NET?) Он работает в направлении, противоположном обычному Linq с точки зрения потока данных.
Дэниел Эрвикер,
25
Ненавижу, что это принятый ответ. Да, конечно, с академической точки зрения интересно, что наблюдаемые в .NET похожи на перечислимые, но что с того? Почти никому, кто найдет этот вопрос, на самом деле не нужны RX / observables (уже есть гораздо более полезные реализации этого в knockout, angularjs и т. Д.), И сам ответ даже не пытается объяснить, в чем актуальность, и даже если это было действительно самый подходящий выбор, вряд ли он «лидирующий» - на него приходится около 1/5 загрузок linq.js.
Aaronaught
2
@Aaronaught Ответ был дан более 3 лет назад, и все определенно изменилось, и linq.js теперь намного опережает то, что было тогда. В то время я считал, что rx.js лучше всего подходит для выполнения операций LINQ с JS, поскольку другие библиотеки не были хорошими или неполными, а над RX работали постоянные разработчики. Кроме того, асинхронность была важна и остается, ИМО, в JavaScript - это то, что вы получаете с Observables. Наконец, обратите внимание, что Observables в Rx сильно отличаются от Knockout и AngularJS Observables и служат разным целям. Ваше мнение учтено, и вы можете голосовать! :)
Ричард Энтони Хейн
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 и методы «Любые».
Натан Палмер
источник
2
Только что нашел сравнение производительности для нескольких linq-подобных библиотек: danieltao.com/lazy.js/comparisons.html
Alexey F
Файл Typescript def - ГОРЯЧИЙ!
kevp 08
1
@AlexeyF Но linq.js нет?
Alex
33

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

Почти ни одна библиотека, о которой я знаю (включая те, с которыми вы связались), не потрудилась сделать реализацию ленивой, как в .NET Linq, они просто немедленно оценивают, используя массивы.

Чтобы получить очень хороший полный набор операций со списком функций, попробуйте: http://osteele.com/sources/javascript/functional/

Дэниел Эрвикер
источник
Если вы знакомы с LINQ, то сохранение большей части синтаксиса будет огромным подспорьем. Ленивая загрузка - не проблема. Похоже, у него есть все необходимые мне функции, но мне придется поэкспериментировать. Я пока оставляю этот вопрос открытым в надежде, что кто-нибудь наткнется на того, кто использовал библиотеки LINQ для JavaScript и поделится своим опытом. По прошествии некоторого времени, если никто не сделает этого, я обязательно дам вам ответ.
Том Тресанский,
25
@Tom - Я склонен немного настороженно относиться к библиотекам, которые пытаются имитировать использование языка X внутри языка Y, если уже существует хороший способ сделать то же самое на языке Y. Я думаю, что лучше выучить "идиомы" "языка Y. Люди писали операторы функциональной последовательности на JS до того, как появился Linq, а в JS они сохранили" традиционные "имена и подходы Lispy, так что теперь это больше стиль JS. Поэтому я говорю: «Когда в Риме ...». Даже в той степени, в которой я размещаю фигурные скобки, которые выстраиваются вертикально в C #, но в JS и Java я помещаю первую в одну строку и т. Д.
Дэниел Эрвикер
2
Очень полезный ответ - особенно, что «выбрать» карты для «карты». В этом случае также можно использовать
underscore.js
1
А как насчет объединения двух массивов? Я пытался выяснить, как получить элементы массива A, которых нет в массиве B, но, похоже, в JQuery нет способа сделать это. В LINQ это довольно тривиально.
Ноэль Абрахамс
@Noel Abrahams - почему бы для такого рода вещей не использовать методы массива ES5 вместо jQuery? напримерa1.filter(function(e) { return a2.indexOf(e) == -1; })
Дэниел Эрвикер
10

Я рекомендую взглянуть на underscore.js . Это не прямой порт LINQ, как некоторые другие, но очень удобный «LINQ-подобный» интерфейс. Он поддерживает все необходимые мне параметры фильтрации, сортировки и проекта, а также имеет отличную документацию и поддержку сообщества.

В качестве бонуса для пользователей Knockout есть UnderscoreKO, который добавляет методы массива Underscore к наблюдаемым массивам Knockout. Демо

Мэтью Николс
источник
3
Я бы тоже определенно предложил подчеркивание. К сожалению, всем доступным библиотекам не хватает производительности. Я сам, как разработчик C #, хотел бы иметь синтаксис C # с библиотекой, ориентированной на javascript, но такой доступной нет. Все вышеупомянутые библиотеки являются «оболочками javascript», что означает, что они пытаются реализовать функции LINQ способом С #. Например, глядя на linq.js, у них есть Словарь, который для получателя выполняет линейный поиск. Объект Javascript ЕСТЬ СЛОВАРЬ с превосходная производительность, но вместо этого они реализовали GetHashCodes и т. д.
Джордж Маврицакис
4
Отличительная черта LINQ - ленивое вычисление. Underscore.js не имеет этой функции. Однако есть lodash, который является надмножеством подчеркивания, работает лучше и поддерживает ленивое вычисление для связанных методов: var arr = _.range (1000); _ (arr) .map (функция (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm 09
3
Да ... это было написано некоторое время назад; Я бы, вероятно, порекомендовал и сейчас lodash. Я рассматривал возможность разветвления UnderscoreKO, чтобы разрешить lodash. Но я не уверен, что согласен с тем, что ленивое вычисление является отличительной чертой LINQ. В основном я ценю LINQ за то, что он обычно передает намерение лучше, чем альтернативные способы выполнения действий. Просто мысль. Во всяком случае, обе хорошие библиотеки.
Мэтью Николс
4

Я лично нахожу операции LINQ / set Union, Intersect, Except и 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, включая возможность цепочки.

user302084
источник
1

Сам ищу что-то подобное и наткнулся на ...

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

Выглядит действительно здорово! Возможно, я просто не понимаю смысла Rx и наблюдаемых по сравнению с настройкой обработчиков событий через что-то вроде jQuery.

Джейкоб Томасон
источник
0

Недавно я сделал библиотеку LINQ для JavaScript. В нем реализовано большинство функций LINQ, предоставляемых .NET, и это самая быстрая из всех библиотек LINQ.

http://fromjs.codeplex.com/

сосать
источник