Thư viện LINQ hàng đầu cho JavaScript là gì? [đóng cửa]


95

Tôi đang tìm một thư viện JavaScript cho phép tôi truy vấn các đối tượng JSON phức tạp bằng cách sử dụng cú pháp giống LINQ. Một tìm kiếm nhanh đã tìm thấy một vài tùy chọn đầy hứa hẹn mà chúng có thể cung cấp những gì tôi cần:

LINQ sang JavaScriptjLinq

  • Có ai có kinh nghiệm sử dụng chúng không?
  • Một số ưu và nhược điểm là gì?
  • Hiệu suất có thể so sánh được không?
  • Cú pháp chuyển hàm của LINQ sang JavaScript có cung cấp bất kỳ lợi ích ẩn nào không (Cá nhân tôi thấy cú pháp của jLinq hấp dẫn hơn ngay từ cái nhìn đầu tiên)?
  • Bạn thấy thiếu điều gì trong một trong hai dự án?
  • Bạn đã bao giờ thử liên hệ với các tác giả? Họ đã phản hồi như thế nào?
  • Dự án nào được sử dụng rộng rãi hơn?

Tôi nghĩ đây sẽ là lần đầu tiên được dùng thử kỹ lưỡng.


Tôi vừa phát hành dự án mã nguồn mở jinqJs.com, điều đó sẽ giúp bạn.
NYTom

Hãy thử LINQ 4 ES 2015, fermium-co.github.io/LINQ4ES2015 Tất cả các phương thức LINQ có cùng cú pháp C #. Đã triển khai cùng một LINQ .NET cho các đặc tả đối tượng.
Yaser Moradi

Tôi đã phát hành dinqyjs.com vài năm trước, có cú pháp giống Linq và rất nhiều chức năng.
garryp 17/02/17

2
Câu hỏi này là cũ và một cách đúng đắn đóng cửa, nhưng đối với độc giả xảy ra trên nó, các tính năng chính của LINQ (lọc, chuyển đổi, và tổng hợp) có thể được thực hiện bằng cách sử dụng được xây dựng trong filter, mapreducechức năng mảng. Cú pháp lambda mới giúp mã trông giống với mã LINQ hơn nhiều.
jpmc 26

Vài tháng trước, tôi đã phát hành Linq-Collections( npmjs.com/package/linq-collections ). Nó sử dụng các quá trình thực thi trì hoãn và hàng tấn tối ưu hóa nội bộ để có tốc độ nhanh như chớp. Dựa trên tiêu chuẩn của Microsoft (nếu bạn biết C # Linq thì bạn biết linq-collection)
Ivan Sanz-Carasa 02/02

Câu trả lời:


13

Bạn đã thấy Rx cho Javascript chưa? Đó là những gì bạn muốn.


2
Tôi đã định đề xuất điều này nhưng nó không thực sự giống với linq đối với các đối tượng. (Nếu đúng như vậy, tại sao chúng ta cần cả Rx và Linq cho Objects trong .NET?) Nó hoạt động theo hướng ngược lại với Linq bình thường về luồng dữ liệu.
Daniel Earwicker

23
Tôi ghét rằng đây là câu trả lời được chấp nhận. Vâng, chắc chắn, thật thú vị về mặt học thuật khi các bảng quan sát trong .NET tương tự như bảng liệt kê, nhưng vậy thì sao? Hầu như không ai tìm thấy câu hỏi này thực sự muốn RX / có thể quan sát (đã có nhiều triển khai hữu ích hơn của nó trong loại trực tiếp, anglejs, v.v.) và bản thân câu trả lời thậm chí không cố gắng giải thích mức độ liên quan là gì, và ngay cả khi nó là thực sự là lựa chọn thích hợp nhất, nó hầu như không "dẫn đầu" - nó có khoảng 1/5 lượt tải xuống linq.js.
Aaronaught

2
@Aaronaught Câu trả lời đã được đưa ra cách đây hơn 3 năm, và mọi thứ chắc chắn đã thay đổi, và linq.js hiện đã đi trước rất nhiều so với những gì nó đã có trước đó. Vào thời điểm đó, tôi tin rằng rx.js là cách tốt nhất để thực hiện các hoạt động LINQ với JS, vì các thư viện khác không tuyệt vời hoặc không đầy đủ và RX có các nhà phát triển toàn thời gian làm việc trên nó. Ngoài ra, không đồng bộ rất quan trọng và vẫn là IMO trong JavaScript - đó là những gì bạn nhận được với Observables. Cuối cùng, lưu ý Observables trong Rx rất khác so với Knockout và AngularJS Observables, và phục vụ các mục đích khác nhau. Ý kiến ​​của bạn được ghi nhận và bạn có thể tự do bỏ phiếu! :)
Richard Anthony Hein

2
@Aaronaught Một lưu ý nữa ... nếu ai đó đang tìm kiếm các thư viện liên quan đến LINQ cho JavaScript, thì họ chắc chắn nên biết về Rx, vì nó là 100% LINQ, và biết LINQ nhưng không phải Rx thực sự chỉ biết một nửa câu chuyện. Chúc mừng.
Richard Anthony Hein

2
Đã có nhiều kinh nghiệm với RX, Linq và JavaScript, tôi có thể nói không do dự rằng ai đó đang tìm kiếm các thư viện giống Linq cho JavaScript chắc chắn không cần biết về RX, và đó chỉ là một nửa câu chuyện nếu bạn xác định cụ thể "câu chuyện" là một nửa RX. Tuyên bố theo cách khác sẽ làm xáo trộn vùng nước và khiến những người có yêu cầu đơn giản khó hiểu các lựa chọn của họ hơn. Nó giống như nói với ai đó đang tìm kiếm một chiếc xe đạp rằng họ cần tìm hiểu về xe máy trước; chắc chắn, mối quan hệ là thú vị, nhưng không đặc biệt hữu ích trong ngữ cảnh.
Aaronaught

71

Bạn có thể muốn kiểm tra linq.js . Nó tuân theo cú pháp .NET lambda và có vẻ được tích hợp tốt trong môi trường Microsoft.

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

Ưu điểm

  • Triển khai tất cả các phương thức .NET 4.0
  • Hoàn thành đánh giá lười biếng
  • Hỗ trợ đầy đủ IntelliSense cho VisualStudio
  • Hỗ trợ jQuery
  • Hỗ trợ Máy chủ Windows Script
  • Ràng buộc đối với Tiện ích mở rộng phản ứng cho JavaScript (RxJS) và Trình tạo IntelliSense
  • Hỗ trợ cài đặt NuGet
  • Cập nhật gần đây (phát hành cuối cùng vào tháng 1 năm 2011)
  • Cú pháp tuân theo cú pháp lambda trong C #

Nhược điểm

  • Thư viện linq.js hơi lớn.
  • Nếu bạn đang sử dụng jQuery hoặc thư viện js khác, chức năng được sử dụng phổ biến nhất có thể đã có sẵn. Xem đặc biệt là bộ lọc của jQuery và các phương thức 'Bất kỳ'.

2
Chỉ cần tìm thấy so sánh hiệu suất trong vài LINQ giống như thư viện: danieltao.com/lazy.js/comparisons.html
Alexey F

Tệp định dạng phân loại là HOT!
kevp

1
@AlexeyF Không có linq.js?
Alex

33

Các toán tử Linq cơ bản và được sử dụng thường xuyên nhất được định nghĩa rất phổ biến trong các thư viện JS được sử dụng rộng rãi. Họ chỉ có những tên khác nhau (trên thực tế, họ có nhiều tên truyền thống hơn ở Linq). Selecttrở thành map, Wheretrở thành filter, FirstFirstOrDefaulttrở thành[0] .

Hầu như không có thư viện nào mà tôi biết (bao gồm cả những thư viện mà bạn đã liên kết) bận tâm đến việc thực hiện lười biếng như trong .NET Linq, họ chỉ đánh giá ngay lập tức bằng cách sử dụng các mảng.

Để có một tập hợp các thao tác danh sách chức năng rất hay, hoàn chỉnh, hãy thử: http://osteele.com/sources/javascript/f Chức năng/


Làm quen với LINQ, giữ nguyên cú pháp giống nhau sẽ là một trợ giúp rất lớn. Tải chậm không phải là một mối quan tâm. Điều này có vẻ như nó có tất cả các chức năng tôi cần, nhưng tôi sẽ phải thử nghiệm một số. Tôi đang giữ câu hỏi mở cho đến bây giờ, với hy vọng ai đó SẼ gặp phải những người đã sử dụng các thư viện JavaScript LINQ và chia sẻ kinh nghiệm của họ. Sau một thời gian trôi qua, nếu không ai khác làm vậy, tôi chắc chắn sẽ cung cấp cho bạn câu trả lời.
Tom Tresansky

25
@Tom - Tôi có xu hướng cảnh giác một chút với các thư viện cố gắng mô phỏng trải nghiệm sử dụng ngôn ngữ X bên trong ngôn ngữ Y nếu đã có cách tốt để làm điều tương tự trong ngôn ngữ Y. Tôi nghĩ tốt hơn là nên học "thành ngữ" "của ngôn ngữ Y. Mọi người đã viết các toán tử chuỗi chức năng trong JS trước khi Linq ra mắt, và trong JS họ vẫn giữ tên và cách tiếp cận Lispy" truyền thống ", vì vậy đó bây giờ là kiểu JS nhiều hơn. Vì vậy, tôi nói "When in Rome ..." Ngay cả trong phạm vi cách tôi đặt các dấu ngoặc nhọn, xếp hàng dọc trong C #, nhưng trong JS và Java, tôi đặt dấu đầu tiên trên cùng một dòng, v.v.
Daniel Earwicker

2
Câu trả lời rất hữu ích - đặc biệt là 'chọn' bản đồ thành 'bản đồ'. Trong trường hợp đó, underscore.js có thể được sử dụng như là tốt
PandaWood

1
Còn việc nối hai mảng thì sao? Tôi đang cố gắng tìm cách lấy các phần tử của mảng A không có trong mảng B, nhưng dường như không có cách nào để làm điều đó trong JQuery. Nó khá tầm thường trong LINQ.
Noel Abrahams

@Noel Abrahams - đối với loại điều này, tại sao không sử dụng các phương thức Mảng ES5 thay vì jQuery? ví dụa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

Tôi khuyên bạn nên xem qua underscore.js . Nó không phải là cổng LINQ trực tiếp như một số cổng khác, nhưng là một trải nghiệm "giống như LINQ" rất thoải mái. Nó hỗ trợ tất cả các tùy chọn lọc, sắp xếp và dự án mà tôi cần và có tài liệu và hỗ trợ cộng đồng tuyệt vời.

Như một phần thưởng cho người dùng Knockout , có UnderscoreKO thêm các phương thức mảng của Underscore vào các mảng có thể quan sát của Knockout. Bản giới thiệu


3
Tôi chắc chắn cũng sẽ đề nghị gạch dưới. Thật không may, tất cả các thư viện có sẵn đều thiếu liên quan đến hiệu suất. Bản thân là nhà phát triển ac #, tôi rất muốn có cú pháp c # với thư viện hướng javascript nhưng không có bất kỳ cú pháp nào như vậy. Tất cả các thư viện nói trên đều là "trình bao bọc javascript" có nghĩa là chúng cố gắng triển khai các hàm LINQ theo cách c #. Ví dụ: nhìn vào linq.js, chúng có một Từ điển, đối với getter thực hiện tìm kiếm tuyến tính. Đối tượng của Javascript LÀ MỘT TỪ ĐIỂN với hiệu suất cao nhưng thay vào đó họ thực hiện GetHashCodes, vv
George Mavritsakis

4
Đặc điểm nổi bật của LINQ là lười đánh giá. Underscore.js không có chức năng này. Tuy nhiên, có lodash là tập hợp lớn hơn của gạch dưới, hoạt động tốt hơn và hỗ trợ đánh giá lười biếng trên các phương thức chuỗi: var arr = _.range (1000); _ (arr) .map (function (v) {return v + 1;}). filter (function (v) {return v% 2;}). take (100) .value ();
srgstm

3
Vâng ... điều này đã được viết một thời gian trước đây; Tôi có thể cũng sẽ giới thiệu lodash bây giờ. Tôi đã xem xét việc chia nhỏ UnderscoreKO để cho phép đăng nhập. Nhưng tôi không chắc tôi đồng ý rằng đánh giá lười biếng là "Tính năng" đặc biệt của LINQ. Phần lớn sự đánh giá cao của tôi về LINQ là nó thường truyền đạt ý định tốt hơn các cách làm việc khác. Chỉ là một suy nghĩ. Ở mức nào cả hai thư viện tốt.
Matthew Nichols

4

Cá nhân tôi thấy các phép toán LINQ / set Union, Intersect, Ngoại trừ và Phân biệt trên các bảng liệt kê trong .NET. rất hữu ích. Có một plugin jquery được gọi là jQuery Array Utilities , cung cấp các phương thức này để được sử dụng trên các mảng.

Ví dụ về mã:

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

trả về [1,2,3]

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

trả về [1,2,3,4,5]

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

trả về [2,3]

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

trả về [1, 2]


Gói jquery-mảng-tiện ích này cũng có thể được cài đặt bằng bower . Tôi muốn giống như để thêm một từ chối trách nhiệm mà tôi ban đầu được làm bằng các plugin :)
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

Có một số thư viện trùng lặp cố gắng chuyển LINQ sang JavaScript với cú pháp và tên phương thức tương tự. Tuy nhiên, trong cộng đồng JS, thư viện đang trở nên thực sự phổ biến và cung cấp chức năng tương tự là Underscore.js .



1

Tôi đang tự mình tìm kiếm một thứ như thế này và bắt gặp ...

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

Điều này trông thực sự tuyệt vời! Có lẽ tôi không hiểu điểm của Rx và các vật có thể quan sát được so với việc thiết lập các trình xử lý sự kiện thông qua một thứ như jQuery.


0

Gần đây tôi đã tạo một thư viện LINQ cho JavaScript. Nó triển khai hầu hết các hàm LINQ do .NET cung cấp và nó là nhanh nhất trong số các thư viện LINQ.

http://fromjs.codeplex.com/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.