JavaScript kitaplığı için önde gelen LINQ nedir? [kapalı]


95

LINQ benzeri bir sözdizimi kullanarak karmaşık JSON nesnelerini sorgulamama izin verecek bir JavaScript kitaplığı arıyorum. Hızlı bir arama, ihtiyacım olanı sunabilecekleri görünen birkaç umut verici seçenek buldu:

LINQ to JavaScript ve jLinq

  • Bunları kullanma tecrübesi olan var mı?
  • Bazı artılar ve eksiler nelerdir?
  • Performans karşılaştırılabilir mi?
  • LINQ to JavaScript'in işlev geçiren sözdizimi herhangi bir gizli fayda sağlıyor mu (kişisel olarak jLinq'in sözdizimini ilk bakışta daha çekici buluyorum)?
  • Her iki projede de eksik olan ne buldunuz?
  • Yazarlarla hiç iletişim kurmayı denedin mi? Ne kadar duyarlıydılar?
  • Hangi proje daha yaygın olarak kullanılıyor?

Bence kapsamlı bir deneme yapacak ilk kişi olacak.


Size yardımcı olması gereken jinqJs.com açık kaynak projesini yeni yayınladım.
NYTom

LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Tüm LINQ yöntemlerini aynı C # sözdizimiyle deneyin . Nesne belirtimlerine aynı .NET LINQ uygulandı.
Yaser Moradi

Dinqyjs.com'u birkaç yıl önce yayınladım, Linq benzeri bir sözdizimi ve birçok işlevselliğe sahip.
garryp

2
Bu soru eski ve haklı olarak kapalı, ama buna karşılaşmıştır okuyucular için, LINQ temel özellikleri (, filtreleme, dönüştürme ve toplayarak) inşa kullanılarak yapılabilir filter, mapve reducedizi fonksiyonları. Yeni lambda sözdizimi, kodun LINQ koduna çok daha benzer görünmesine yardımcı olur.
jpmc26

Birkaç ay önce yayınladım Linq-Collections( npmjs.com/package/linq-collections ). Hızla parlamak için ertelenmiş yürütmeleri ve tonlarca dahili optimizasyonu kullanır. Microsoft'un standardına göre (C # Linq'i biliyorsanız, o zaman linq-koleksiyonlarını biliyorsunuzdur)
Ivan Sanz-Carasa

Yanıtlar:


13

Henüz Javascript için Rx'i gördünüz mü ? İstediğin bu.


2
Bunu önerecektim ama aslında nesnelere linq ile aynı değil. (Eğer öyleyse, neden hem Rx hem de Linq to Objects in .NET'e ihtiyacımız olsun?) Veri akışı açısından normal Linq'in tersi yönde çalışır.
Daniel Earwicker

25
Bunun kabul edilen cevap olmasından nefret ediyorum. Evet, tabii ki, .NET'teki gözlemlenebilirlerin numaralandırılabilirlere benzer olması akademik olarak ilginç, ama ne olmuş? Bu soruyu bulan hemen hemen hiç kimse aslında RX / gözlemlenebilirler istemez (nakavt, açısal js, vs.'de bunun çok daha yararlı uygulamaları vardır) ve cevabın kendisi alaka düzeyinin ne olduğunu açıklamaya bile çalışmaz ve öyle olsa bile gerçekten en uygun seçim, neredeyse "lider" - linq.js'nin yaklaşık 1 / 5'ini indiriyor.
Aaronaught

2
@Aaronaught Cevap 3 yıldan fazla bir süre önce verildi ve işler kesinlikle değişti ve linq.js şimdi o zamanlar olduğundan çok daha ileride. O zamanlar, rx.js'nin JS ile LINQ işlemleri yapmak için en iyi seçenek olduğuna inanıyordum, çünkü diğer kütüphaneler harika ya da eksik değildi ve RX üzerinde tam zamanlı geliştiriciler çalışıyordu. Ayrıca, eşzamansız önemliydi ve hala IMO, JavaScript'te - Observables ile elde ettiğiniz şey budur. Son olarak, Rx'deki Observables'ın Knockout ve AngularJS Observables'den çok farklı olduğunu ve farklı amaçlara hizmet ettiğini unutmayın. Fikirleriniz not edilir ve oy vermekte özgürsünüz! :)
Richard Anthony Hein

2
@Aaronaught Bir not daha ... Eğer birisi JavaScript için LINQ ile ilgili kütüphaneler arıyorsa, o zaman kesinlikle% 100 LINQ olduğu için Rx hakkında bilgi sahibi olmalıdır ve LINQ'yu bilmek ama Rx'i bilmemek aslında hikayenin sadece yarısını bilmek demektir. Şerefe.
Richard Anthony Hein

2
RX, Linq ve JavaScript ile kapsamlı deneyime sahip olduğumdan, hiç tereddüt etmeden söyleyebilirim ki, JavaScript için Linq benzeri kitaplıklar arayan birinin kesinlikle RX hakkında bilgi sahibi olmasına gerek yoktur ve "hikayeyi" özel olarak tanımlarsanız, hikayenin sadece yarısı budur. yarı RX olacak. Aksini iddia etmek, suları bulandırmak ve basit gereksinimleri olan insanların seçeneklerini anlamalarını zorlaştırmaktır. Bisiklet arayan birine önce motosikletleri öğrenmesi gerektiğini söylemek gibi; Elbette, ilişki ilginç, ancak bağlamda pek kullanışlı değil.
Aaronaught

71

Linq.js'yi kontrol etmek isteyebilirsiniz . .NET lambda sözdizimini izler ve bir Microsoft ortamına iyi entegre edilmiş gibi görünür.

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

Artıları

  • Tüm .NET 4.0 yöntemlerini uygular
  • Tam tembel değerlendirme
  • VisualStudio için tam IntelliSense desteği
  • JQuery'yi destekler
  • Windows Script Host'u destekler
  • JavaScript (RxJS) ve IntelliSense Oluşturucu için Reaktif Uzantılar için Bağlama
  • NuGet yükleme desteği
  • Yakın zamanda güncellendi (son sürüm, Ocak 2011)
  • Sözdizimi, C # 'da lambda sözdizimine uygundur

Eksileri

  • Linq.js kitaplığı biraz büyüktür.
  • Zaten jQuery veya diğer js kitaplığını kullanıyorsanız, en sık kullanılan işlevsellik muhtemelen zaten mevcuttur. Özellikle jQuery'nin filtresine ve 'Herhangi' yöntemlerine bakın.

2
Birkaç linq benzeri kitaplık için performans karşılaştırması buldum: danieltao.com/lazy.js/comparisons.html
Alexey F

Typescript def dosyası SICAK!
kevp

1
@AlexeyF Yine de linq.js yok mu?
Alex

34

En temel ve en sık kullanılan Linq operatörleri, yaygın olarak kullanılan JS kitaplıklarında çok yaygın olarak tanımlanır. Sadece farklı isimleri var (aslında, Linq'tekinden daha geleneksel isimleri var). Selectolur map, Whereolur filter, Firstve FirstOrDefaultolmak [0].

Neredeyse bildiğim hiçbir kitaplık (sanırım bağlandığınız kitaplıklar da dahil olmak üzere) uygulamayı .NET Linq'teki gibi tembel hale getirme zahmetine girmiyor, sadece dizileri kullanarak hemen değerlendiriyorlar.

Çok güzel, eksiksiz bir işlevsel liste işlemleri seti için şunu deneyin: http://osteele.com/sources/javascript/functional/


LINQ'ya aşina olmak, sözdiziminin çoğunu aynı tutmak çok yardımcı olacaktır. Tembel yükleme bir endişe oluşturmaz. Bu, ihtiyacım olan tüm işlevselliğe sahip gibi görünüyor, ancak bazılarını denemem gerekecek. Şimdilik soruyu açık tutuyorum, umarım birisi JavaScript LINQ kitaplıklarını kimin kullandığını görüp deneyimlerini paylaşır. Bir süre sonra, kimse yapmazsa, size cevabı vereceğimden emin olacağım.
Tom Tresansky

25
@Tom - Aynı şeyi Y dilinde de yapmanın iyi bir yolu varsa, Y dilinde X dilini kullanma deneyimini simüle etmeye çalışan kütüphanelere karşı biraz temkinli olma eğilimindeyim. "Deyimleri öğrenmek daha iyidir" "Y dilinin" "Linq çıkmadan önce insanlar JS'de işlevsel sıra operatörleri yazıyorlardı ve JS'de" geleneksel "Lispy adlarını ve yaklaşımlarını korudular, bu yüzden artık daha JS stili bu. Bu yüzden "Roma'dayken ..." diyorum, C # ile dikey olarak
sıralanan

2
Çok faydalı cevap - özellikle 'haritaya' eşlemek için 'seç. Bu durumda,
undercore.js

1
İki diziye katılmaya ne dersiniz? A dizisinin B dizisinde olmayan öğelerini nasıl elde edeceğimi bulmaya çalışıyordum, ancak bunu JQuery'de yapmanın bir yolu yok gibi görünüyor. LINQ'da oldukça önemsizdir.
Noel Abrahams

@Noel Abrahams - bu tür bir şey için neden jQuery yerine ES5 Array yöntemlerini kullanmıyorsunuz? örneğina1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

Undercore.js'ye bir göz atmanızı tavsiye ederim . Bazıları gibi doğrudan bir LINQ bağlantı noktası değil, çok rahat "LINQ benzeri" bir deneyimdir. İhtiyacım olan tüm filtre, sıralama ve proje seçeneklerini destekliyor ve mükemmel belgelere ve topluluk desteğine sahip.

Knockout kullanıcıları için bir bonus olarak , Alt Çizgi'nin dizi yöntemlerini Knockout'un gözlemlenebilir dizilerine ekleyen UnderscoreKO vardır. Demo


3
Ben de kesinlikle alt çizgi öneririm. Ne yazık ki mevcut kitaplıkların tümü performans açısından eksiktir. Bir ac # geliştirici olarak, javascript odaklı bir kitaplık ile c # sözdizimine sahip olmayı çok isterdim, ancak böyle bir şey yok. Yukarıda bahsedilen kitaplıkların tümü "javascript sarmalayıcılardır", bu da LINQ işlevlerini c # yöntemiyle uygulamaya çalıştıkları anlamına gelir. Örneğin, linq.js'ye bakıldığında, alıcı için doğrusal bir arama yapan bir Sözlüğe sahiptirler. Javascript'in nesnesi bir SÖZLÜKTÜR üstün performans ancak bunun yerine GetHashCodes vb. uyguladılar.
George Mavritsakis

4
LINQ'nun ayırt edici özelliği, tembel değerlendirmedir. Underscore.js bu işlevselliğe sahip değildir. Ancak, alt çizginin bir üst kümesi olan, daha iyi performans gösteren ve zincirleme yöntemlerde tembel değerlendirmeyi destekleyen lodash vardır: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filtre (function (v) {return v% 2;}). take (100) .value ();
srgstm

3
Evet ... bu bir süre önce yazılmıştı; Lodash'ı da şimdi tavsiye ederim. Lodash'a izin vermek için UnderscoreKO'yu çatallamayı düşünüyordum. Ancak, tembel değerlendirmenin LINQ'nun ayırt edici özelliği olduğunu kabul ettiğimden emin değilim. Çoğunlukla, LINQ'ya olan minnettarlığım, normalde niyeti, işleri yapmanın alternatif yollarından daha iyi iletmesidir. Sadece bir düşünce. Her halükarda hem iyi kitaplıklar.
Matthew Nichols

4

Ben şahsen LINQ / set işlemlerini Union, Intersect, Except ve Distinct'i .NET'teki numaralandırılabilirler üzerinde buluyorum. çok kullanışlı. Bu yöntemlerin dizilerde kullanılmasını sağlayan jQuery Array Utilities adında bir jquery eklentisi bulunmaktadır .

Kod örnekleri:

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

şunu döndürür [1,2,3]

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

döndürür [1,2,3,4,5]

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

döndürür [2,3]

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

şunu döndürür [1, 2]


Bu paket jquery-array-utilities , bower kullanılarak da kurulabilir . Eklentiyi ilk yaptığım için bir sorumluluk reddi beyanı eklemek istiyorum :)
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

LINQ'yu JavaScript'e benzer bir sözdizimi ve yöntem adlarıyla taşımaya çalışan bazı çoğaltılmış kitaplıklar var. Bununla birlikte, JS topluluğunda, gerçekten popüler hale gelen ve aynı işlevselliği sağlayan kütüphane Underscore.js'dir .



1

Ben de böyle bir şey arıyorum ve karşıma çıktı ...

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

Bu gerçekten harika görünüyor! Belki de jQuery gibi bir şey aracılığıyla olay işleyicileri ayarlamaya kıyasla Rx ve gözlemlenebilirlerin amacını anlamıyorum.


0

Yakın zamanda JavaScript için bir LINQ kitaplığı yaptım. .NET tarafından sağlanan çoğu LINQ işlevini gerçekleştirmiştir ve tüm LINQ kitaplıklarının en hızlısıdır.

http://fromjs.codeplex.com/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.