Apa LINQ terkemuka untuk pustaka JavaScript? [Tutup]


95

Saya mencari pustaka JavaScript yang memungkinkan saya menanyakan objek JSON yang kompleks menggunakan sintaks seperti LINQ. Pencarian cepat menemukan beberapa opsi yang menjanjikan yang terlihat mungkin menawarkan apa yang saya butuhkan:

LINQ ke JavaScript dan jLinq

  • Apakah ada yang punya pengalaman menggunakannya?
  • Apa sajakah pro dan kontra?
  • Apakah kinerjanya sebanding?
  • Apakah sintaks penerusan fungsi LINQ ke JavaScript menawarkan manfaat tersembunyi (menurut saya pribadi, sintaks jLinq lebih menarik pada pandangan pertama)?
  • Apa yang menurut Anda kurang di kedua proyek?
  • Apakah Anda pernah mencoba menghubungi penulis? Seberapa tanggap mereka?
  • Proyek apa yang lebih banyak digunakan?

Saya pikir ini akan menjadi yang pertama mendapatkan uji coba menyeluruh.


Saya baru saja merilis proyek sumber terbuka jinqJs.com, yang akan membantu Anda.
NYTom

Coba LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Semua metode LINQ dengan sintaks C # yang sama. Menerapkan .NET LINQ yang sama ke spesifikasi objek.
Yaser Moradi

Saya merilis dinqyjs.com beberapa tahun yang lalu, memiliki sintaks mirip Linq dan banyak fungsi.
garryp

2
Pertanyaan ini sudah tua dan memang ditutup, tapi bagi pembaca yang terjadi di atasnya, fitur utama dari LINQ (penyaringan, mengubah, dan menggabungkan) dapat dilakukan dengan menggunakan dibangun di filter, map, dan reducefungsi array. Sintaks lambda baru membantu membuat kode terlihat lebih mirip dengan kode LINQ.
jpmc26

Beberapa bulan yang lalu saya merilis Linq-Collections( npmjs.com/package/linq-collections ). Ini menggunakan eksekusi yang ditangguhkan dan banyak pengoptimalan internal untuk menjadi sangat cepat. Berdasarkan standar Microsoft (jika Anda tahu C # Linq maka Anda tahu linq-collections)
Ivan Sanz-Carasa

Jawaban:


13

Pernahkah Anda melihat Rx untuk Javascript ? Itu yang kamu mau.


2
Saya akan menyarankan ini tetapi tidak benar-benar sama dengan linq ke objek. (Jika ya, mengapa kita membutuhkan Rx dan Lini ke Objek di .NET?) Ini bekerja dalam arah yang berlawanan dengan Lini normal dalam hal aliran data.
Daniel Earwicker

25
Saya benci bahwa ini adalah jawaban yang diterima. Ya, tentu, secara akademis menarik bahwa observable di .NET mirip dengan enumerable, tapi terus kenapa? Hampir tidak ada yang menemukan pertanyaan ini benar-benar menginginkan RX / observable (sudah ada implementasi yang jauh lebih berguna dari itu di knockout, angularjs, dll.) Dan jawabannya sendiri bahkan tidak mencoba menjelaskan apa relevansinya, dan bahkan jika itu relevan. benar-benar pilihan yang paling tepat, ini hampir tidak "memimpin" - ini memiliki sekitar 1/5 unduhan linq.js.
Aaronaught

2
@Aaronaught Jawabannya diberikan lebih dari 3 tahun yang lalu, dan banyak hal telah benar-benar berubah, dan linq.js sekarang jauh di depan apa yang dulu. Pada saat itu, saya percaya rx.js adalah pilihan terbaik untuk melakukan operasi LINQ dengan JS, karena perpustakaan lain tidak bagus atau tidak lengkap dan RX memiliki pengembang penuh waktu yang mengerjakannya. Juga, asinkron itu penting dan masih, IMO, dalam JavaScript - yang Anda dapatkan dengan Observables. Akhirnya, catatan Observable di Rx sangat berbeda dari Knockout dan AngularJS Observables, dan memiliki tujuan yang berbeda. Pendapat Anda dicatat, dan Anda bebas memilih! :)
Richard Anthony Hein

2
@Aaronaught Satu catatan lagi ... jika seseorang mencari perpustakaan terkait LINQ untuk JavaScript, maka mereka pasti tahu tentang Rx, karena ini 100% LINQ, dan mengetahui LINQ tetapi bukan Rx sebenarnya hanya mengetahui setengah cerita. Bersulang.
Richard Anthony Hein

2
Memiliki pengalaman yang luas dengan RX, Linq, dan JavaScript, saya dapat mengatakan tanpa ragu bahwa seseorang yang mencari perpustakaan mirip Linq untuk JavaScript pasti tidak perlu tahu tentang RX, dan itu hanya setengah cerita jika Anda secara khusus mendefinisikan "cerita" menjadi setengah RX. Mengklaim sebaliknya akan memperburuk kondisi dan mempersulit orang dengan persyaratan sederhana untuk memahami pilihan mereka. Ini seperti memberi tahu seseorang yang sedang mencari sepeda bahwa mereka perlu belajar tentang sepeda terlebih dahulu; tentu saja, hubungannya menarik, tetapi tidak terlalu berguna dalam konteksnya.
Aaronaught

71

Anda mungkin ingin memeriksa linq.js . Ini mengikuti sintaks lambda .NET dan terlihat terintegrasi dengan baik dalam lingkungan Microsoft.

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

Pro

  • Menerapkan semua metode .NET 4.0
  • Selesaikan evaluasi malas
  • Dukungan IntelliSense penuh untuk VisualStudio
  • Mendukung jQuery
  • Mendukung Windows Script Host
  • Mengikat untuk Ekstensi Reaktif untuk JavaScript (RxJS) dan Generator IntelliSense
  • Dukungan instal NuGet
  • Diperbarui baru-baru ini (rilis terakhir Jan 2011)
  • Sintaks sesuai dengan sintaks lambda di C #

Kontra

  • Pustaka linq.js agak besar.
  • Jika Anda sudah menggunakan jQuery atau library js lainnya, fungsionalitas yang paling umum digunakan mungkin sudah tersedia. Lihat terutama filter jQuery , dan metode 'Any'.

2
Baru saja menemukan perbandingan kinerja untuk beberapa pustaka mirip linq: danieltao.com/lazy.js/comparisons.html
Alexey F

File def ketikan adalah HOT!
kevp

1
@AlexeyF Tidak ada linq.js sekalipun?
Alex

33

Operator Linq yang paling dasar dan sering digunakan sangat umum didefinisikan di pustaka JS yang banyak digunakan. Mereka hanya punya nama yang berbeda (nyatanya, mereka punya nama yang lebih tradisional daripada di Linq). Selectmenjadi map, Wheremenjadi filter, Firstdan FirstOrDefaultmenjadi [0].

Hampir tidak ada perpustakaan yang saya tahu (termasuk saya pikir yang Anda tautkan) repot-repot membuat implementasi malas seperti di .NET Linq, mereka hanya mengevaluasi segera menggunakan array.

Untuk rangkaian operasi daftar fungsional yang sangat bagus dan lengkap, coba: http://osteele.com/sources/javascript/functional/


Mengenal LINQ, menjaga sintaks yang sama akan sangat membantu. Pemuatan lambat bukanlah masalah. Sepertinya ini memang memiliki semua fungsi yang saya butuhkan, tetapi saya harus bereksperimen beberapa. Saya tetap membuka pertanyaan untuk saat ini, dengan harapan seseorang AKAN tersandung oleh siapa yang telah menggunakan perpustakaan JavaScript LINQ dan berbagi pengalaman mereka. Setelah beberapa waktu berlalu, jika tidak ada orang lain yang melakukannya, saya pasti akan memberikan jawabannya.
Tom Tresansky

25
@Tom - Saya cenderung agak waspada terhadap perpustakaan yang mencoba mensimulasikan pengalaman menggunakan bahasa X di dalam bahasa Y jika sudah ada cara yang baik untuk melakukan hal yang sama dalam bahasa Y. Saya pikir lebih baik mempelajari "idiom "dari bahasa Y. Orang-orang menulis operator urutan fungsional di JS sebelum Linq keluar, dan di JS mereka mempertahankan nama dan pendekatan Lispy" tradisional ", jadi itu sekarang lebih bergaya JS. Jadi saya mengatakan "Ketika di Roma ..." Bahkan sejauh bagaimana saya meletakkan tanda kurung kurawal, yang berbaris secara vertikal di C #, tetapi di JS dan Java saya meletakkan yang pertama di baris yang sama, dll.
Daniel Earwicker

2
Jawaban yang sangat berguna - terutama yang 'pilih' peta ke 'peta'. Dalam hal ini, underscore.js juga dapat digunakan
PandaWood

1
Bagaimana dengan menggabungkan dua array? Saya mencoba mencari cara untuk mendapatkan elemen dari array A yang tidak ada dalam array B, tetapi sepertinya tidak ada cara untuk melakukannya di JQuery. Ini cukup sepele di LINQ.
Noel Abrahams

@ Noel Abrahams - untuk hal semacam ini mengapa tidak menggunakan metode Array ES5 daripada jQuery? misalnyaa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

Saya sarankan untuk melihat underscore.js . Ini bukan port LINQ langsung seperti beberapa yang lain, tetapi merupakan pengalaman "seperti LINQ" yang sangat nyaman. Ini mendukung semua opsi filter, urutkan dan proyek yang saya butuhkan dan memiliki dokumentasi yang sangat baik dan dukungan komunitas.

Sebagai bonus untuk pengguna Knockout , ada UnderscoreKO yang menambahkan metode array Underscore ke array yang dapat diamati Knockout. Demo


3
Saya pasti akan menyarankan garis bawah juga. Sayangnya semua pustaka yang tersedia kekurangan kinerja. Menjadi ac # developer sendiri, saya ingin memiliki sintaks c # dengan pustaka berorientasi javascript tetapi tidak ada yang tersedia. Semua pustaka yang disebutkan di atas adalah "javascript wrappers 'yang berarti mereka mencoba mengimplementasikan fungsi LINQ dengan cara c #. Misalnya, melihat linq.js mereka memiliki Kamus yang, untuk pengambil melakukan pencarian linier. Objek Javascript IS A KAMUS dengan kinerja yang unggul tetapi mereka menerapkan GetHashCodes dll.
George Mavritsakis

4
Ciri khas LINQ adalah evaluasi malas. Underscore.js tidak memiliki fungsi ini. Namun, ada lodash yang merupakan superset dari garis bawah, berkinerja lebih baik, dan mendukung evaluasi malas pada metode berantai: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm

3
Ya ... ini ditulis beberapa waktu lalu; Saya kemungkinan besar akan merekomendasikan lodash sekarang juga. Saya telah mempertimbangkan untuk menggunakan UnderscoreKO untuk mengizinkan lodash. Tapi saya tidak yakin saya setuju bahwa evaluasi malas adalah "The" ciri khas LINQ. Sebagian besar apresiasi saya terhadap LINQ adalah bahwa LINQ biasanya mengkomunikasikan niat dengan lebih baik daripada cara alternatif dalam melakukan sesuatu. Hanya pemikiran saja. Bagaimanapun juga, keduanya merupakan perpustakaan yang bagus.
Matthew Nichols

4

Saya pribadi menemukan LINQ / set operasi Union, Intersect, Kecuali dan Distinct pada enumerables di .NET. sangat berguna. Ada plugin jquery yang disebut jQuery Array Utilities yang menyediakan metode ini untuk digunakan pada array.

Contoh kode:

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

mengembalikan [1,2,3]

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

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

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

kembali [2,3]

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

mengembalikan [1, 2]


Paket jquery-array-utilities ini juga dapat diinstal menggunakan bower . Saya ingin menambahkan penafian bahwa saya yang membuat plugin ini :)
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

Ada beberapa pustaka duplikat di luar sana yang mencoba mem-port LINQ ke JavaScript dengan sintaks dan nama metode yang serupa. Namun, dalam komunitas JS, pustaka yang menjadi sangat populer dan menyediakan fungsionalitas yang sama adalah Underscore.js .




0

Saya baru-baru ini membuat perpustakaan LINQ untuk JavaScript. Ini menerapkan sebagian besar fungsi LINQ yang disediakan oleh .NET dan ini adalah yang tercepat dari semua pustaka LINQ.

http://fromjs.codeplex.com/

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.