LINQ ชั้นนำสำหรับไลบรารี JavaScript คืออะไร [ปิด]


95

ฉันกำลังมองหาไลบรารี JavaScript ที่จะช่วยให้ฉันสืบค้นอ็อบเจ็กต์ JSON ที่ซับซ้อนโดยใช้ไวยากรณ์แบบ LINQ การค้นหาอย่างรวดเร็วพบตัวเลือกที่มีแนวโน้มสองสามตัวที่ดูเหมือนว่าพวกเขาอาจเสนอสิ่งที่ฉันต้องการ:

LINQ เป็น JavaScriptและjLinq

  • มีใครมีประสบการณ์ใช้งานบ้างไหม?
  • ข้อดีข้อเสียมีอะไรบ้าง?
  • ประสิทธิภาพเทียบได้หรือไม่?
  • ไวยากรณ์การส่งผ่านฟังก์ชันของ LINQ ไปยัง JavaScript มีประโยชน์ที่ซ่อนอยู่หรือไม่ (โดยส่วนตัวแล้วฉันพบว่าไวยากรณ์ของ jLinq น่าสนใจกว่าเมื่อมองแวบแรก) หรือไม่
  • คุณพบว่าขาดอะไรในทั้งสองโครงการ?
  • คุณเคยลองติดต่อผู้เขียนหรือไม่? พวกเขาตอบสนองแค่ไหน?
  • โครงการใดใช้กันอย่างแพร่หลาย

ฉันคิดว่าจะเป็นคนแรกที่ได้ทดลองใช้อย่างละเอียด


ฉันเพิ่งเปิดตัวโครงการโอเพนซอร์ส jinqJs.com ซึ่งน่าจะช่วยคุณได้
NYTom

ลองใช้ 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-collections)
Ivan Sanz-Carasa

คำตอบ:


13

คุณเคยเห็นRx สำหรับ Javascriptหรือยัง? นั่นคือสิ่งที่คุณต้องการ


2
ฉันจะแนะนำสิ่งนี้ แต่มันไม่เหมือนกับ linq กับวัตถุ (ถ้าเป็นเช่นนั้นทำไมเราถึงต้องการทั้ง Rx และ Linq ใน Objects ใน. NET) มันทำงานในทิศทางตรงกันข้ามกับ Linq ปกติในแง่ของการไหลของข้อมูล
Daniel Earwicker

25
ฉันเกลียดที่นี่เป็นคำตอบที่ได้รับการยอมรับ ใช่แน่นอนว่ามันน่าสนใจในเชิงวิชาการที่สิ่งที่สังเกตได้ใน. NET นั้นคล้ายกับการแจงนับ แต่แล้วยังไงล่ะ? แทบไม่มีใครที่พบว่าคำถามนี้ต้องการ RX / observables จริงๆ (มีการใช้งานที่มีประโยชน์มากกว่านี้อยู่แล้วในสิ่งที่น่าพิศวง angularjs ฯลฯ ) และคำตอบเองก็ไม่ได้พยายามอธิบายว่าความเกี่ยวข้องคืออะไรและแม้ว่าจะเป็น เป็นตัวเลือกที่เหมาะสมที่สุดจริงๆแทบจะไม่ "นำหน้า" - มีการดาวน์โหลด linq.js ประมาณ 1/5
Aaronaught

2
@Aaronaught คำตอบนั้นได้รับเมื่อ 3 ปีที่แล้วและสิ่งต่างๆได้เปลี่ยนไปอย่างแน่นอนและตอนนี้ linq.js ก็นำหน้าสิ่งที่เป็นอยู่ในตอนนั้น ในเวลานั้นฉันเชื่อว่า rx.js เป็นทางออกที่ดีที่สุดสำหรับการดำเนินการ LINQ กับ JS เนื่องจากไลบรารีอื่น ๆ ไม่ดีหรือไม่สมบูรณ์และ RX มีนักพัฒนาเต็มเวลาที่ทำงานอยู่ นอกจากนี้ async ยังมีความสำคัญและยังคงเป็น IMO ใน JavaScript ซึ่งเป็นสิ่งที่คุณได้รับจาก Observables สุดท้ายหมายเหตุ Observables ใน Rx นั้นแตกต่างจาก Knockout และ AngularJS Observables มากและตอบสนองวัตถุประสงค์ที่แตกต่างกัน ความคิดเห็นของคุณได้รับการจดบันทึกและคุณสามารถลงคะแนนได้ฟรี! :)
Richard Anthony Hein

2
@Aaronaught อีกหนึ่งข้อสังเกต ... หากใครกำลังมองหาไลบรารีที่เกี่ยวข้องกับ LINQ สำหรับ JavaScript พวกเขาควรรู้เกี่ยวกับ Rx อย่างแน่นอนเนื่องจากเป็น LINQ 100% และรู้จัก LINQ แต่ไม่ใช่ Rx ที่รู้เพียงครึ่งเรื่องเท่านั้น ไชโย
Richard Anthony Hein

2
ด้วยประสบการณ์ที่ยาวนานกับ RX, Linq และ JavaScript ฉันสามารถพูดได้โดยไม่ลังเลว่าใครบางคนที่กำลังมองหาไลบรารีที่เหมือน Linq สำหรับ JavaScript ไม่จำเป็นต้องรู้เกี่ยวกับ RX อย่างแน่นอนและเป็นเพียงครึ่งเดียวหากคุณกำหนด "เรื่องราว" โดยเฉพาะ เป็น RX ครึ่งหนึ่ง การอ้างว่าเป็นอย่างอื่นเป็นการทำให้น้ำขุ่นและทำให้ผู้ที่มีข้อกำหนดง่ายๆเข้าใจตัวเลือกของตนได้ยากขึ้น เหมือนกับการบอกคนที่กำลังมองหาจักรยานว่าต้องเรียนรู้เกี่ยวกับมอเตอร์ไซค์ก่อน แน่นอนว่าความสัมพันธ์นั้นน่าสนใจ แต่ไม่มีประโยชน์อย่างยิ่งในบริบท
Aaronaught

71

คุณอาจต้องการตรวจสอบlinq.js linq.jsเป็นไปตามไวยากรณ์แลมบ์ดา. NET และดูเหมือนว่าจะรวมเข้าด้วยกันได้ดีในสภาพแวดล้อมของ Microsoft

LINQ สำหรับ JavaScript - http://linqjs.codeplex.com/

ข้อดี

  • ใช้วิธี. NET 4.0 ทั้งหมด
  • ประเมินความขี้เกียจให้เสร็จสิ้น
  • รองรับ IntelliSense เต็มรูปแบบสำหรับ VisualStudio
  • รองรับ jQuery
  • รองรับ Windows Script Host
  • การผูกสำหรับ Reactive Extensions สำหรับ JavaScript (RxJS) และ IntelliSense Generator
  • รองรับการติดตั้ง NuGet
  • อัปเดตล่าสุด (รุ่นล่าสุด ม.ค. 2554)
  • ไวยากรณ์สอดคล้องกับไวยากรณ์แลมบ์ดาใน C #

จุดด้อย

  • ไลบรารี linq.js มีขนาดใหญ่เล็กน้อย
  • หากคุณใช้ jQuery หรือไลบรารี js อื่นอยู่แล้วฟังก์ชันที่ใช้บ่อยที่สุดอาจพร้อมใช้งาน ดูตัวกรองของ jQuery โดยเฉพาะและวิธีการ "ใด ๆ "

2
เพิ่งพบการเปรียบเทียบประสิทธิภาพสำหรับไลบรารีคล้าย linq หลายรายการ: danieltao.com/lazy.js/comparisons.html
Alexey F

ไฟล์ typescript def ร้อนแรง!
kevp

1
@AlexeyF ไม่มี linq.js เหรอ?
Alex

34

ตัวดำเนินการ Linq ขั้นพื้นฐานและใช้บ่อยที่สุดมักถูกกำหนดไว้ในไลบรารี JS ที่ใช้กันอย่างแพร่หลาย พวกเขามีชื่อที่แตกต่างกัน (อันที่จริงพวกเขามีชื่อดั้งเดิมมากกว่าใน Linq) Selectกลายเป็นmap, Whereกลายเป็นfilter, FirstและFirstOrDefaultกลายเป็น[0]กลายเป็น

แทบไม่มีไลบรารีที่ฉันรู้จัก (รวมถึงฉันคิดว่าสิ่งที่คุณเชื่อมโยงด้วย) รำคาญที่จะทำให้การใช้งานขี้เกียจเหมือนใน. NET Linq พวกเขาเพิ่งประเมินทันทีโดยใช้อาร์เรย์

สำหรับการดำเนินการรายการฟังก์ชันที่ดีและสมบูรณ์ให้ลอง: http://osteele.com/sources/javascript/functional/


การคุ้นเคยกับ LINQ การรักษาไวยากรณ์ให้เหมือนเดิมจะช่วยได้มาก ขี้เกียจโหลดไม่น่ากังวล ดูเหมือนว่ามันจะมีฟังก์ชันทั้งหมดที่ฉันต้องการ แต่ฉันจะต้องทดลองบ้าง ตอนนี้ฉันยังคงเปิดคำถามอยู่หวังว่าจะมีคนสะดุดเพราะใครใช้ไลบรารี JavaScript LINQ และแบ่งปันประสบการณ์ของพวกเขา หลังจากเวลาผ่านไปถ้าไม่มีใครทำฉันจะตอบคุณอย่างแน่นอน
Tom Tresansky

25
@Tom - ฉันมักจะระวังห้องสมุดที่พยายามจำลองประสบการณ์การใช้ภาษา X ภายในภาษา Y หากมีวิธีที่ดีในการทำสิ่งเดียวกันในภาษา Y ฉันคิดว่าการเรียนรู้สำนวนจะดีกว่า "ของภาษา Y ผู้คนกำลังเขียนตัวดำเนินการลำดับฟังก์ชันใน JS ก่อนที่ Linq จะออกมาและใน JS พวกเขายังคงใช้ชื่อและแนวทางลิสปี" ดั้งเดิม "ดังนั้นตอนนี้จึงเป็นรูปแบบ JS มากขึ้น ดังนั้นฉันจึงพูดว่า "เมื่ออยู่ในกรุงโรม ... " แม้ว่าฉันจะวางวงเล็บปีกกาอย่างไรซึ่งเรียงตามแนวตั้งใน C # แต่ใน JS และ Java ฉันใส่อันแรกในบรรทัดเดียวกันเป็นต้น
Daniel Earwicker

2
คำตอบที่มีประโยชน์มาก - โดยเฉพาะอย่างยิ่งที่ "เลือก" แผนที่เป็น "แผนที่" ในกรณีนี้สามารถใช้ underscore.js ได้เช่นกัน
PandaWood

1
แล้วการเชื่อมต่อสองอาร์เรย์ล่ะ ฉันพยายามหาวิธีรับองค์ประกอบของอาร์เรย์ A ที่ไม่ได้อยู่ในอาร์เรย์ B แต่ดูเหมือนจะไม่มีวิธีทำใน JQuery ค่อนข้างเป็นเรื่องเล็กน้อยใน LINQ
Noel Abrahams

@Noel Abrahams - สำหรับสิ่งนี้ทำไมไม่ใช้เมธอด ES5 Array แทน jQuery? เช่นa1.filter(function(e) { return a2.indexOf(e) == -1; })
Daniel Earwicker

10

เราขอแนะนำให้ดูที่underscore.js ไม่ใช่พอร์ต LINQ โดยตรงเหมือนพอร์ตอื่น ๆ แต่เป็นประสบการณ์ "เหมือน LINQ" ที่สะดวกสบายมาก รองรับตัวกรองการเรียงลำดับและโปรเจ็กต์ทั้งหมดที่ฉันต้องการและมีเอกสารที่ดีเยี่ยมและการสนับสนุนจากชุมชน

เป็นโบนัสสำหรับผู้ใช้KnockoutมีUnderscoreKOที่เพิ่มวิธีการอาร์เรย์ของ Underscore ให้กับอาร์เรย์ที่สังเกตได้ของ Knockout การสาธิต


3
ฉันขอแนะนำขีดล่างด้วย น่าเสียดายที่ไลบรารีที่มีอยู่ทั้งหมดขาดประสิทธิภาพ ในฐานะนักพัฒนา ac # ด้วยตัวเองฉันชอบที่จะมีไวยากรณ์ c # พร้อมกับไลบรารีที่เน้นจาวาสคริปต์ แต่ไม่มีให้ใช้งาน ไลบรารีทั้งหมดที่กล่าวมาคือ "javascript wrappers" ซึ่งหมายความว่าพวกเขาพยายามใช้ฟังก์ชัน LINQ ด้วยวิธี c # ตัวอย่างเช่นดู linq.js พวกเขามีพจนานุกรมซึ่งสำหรับ getter จะทำการค้นหาเชิงเส้นวัตถุของ Javascript เป็นพจนานุกรมที่มี ประสิทธิภาพที่เหนือกว่า แต่กลับใช้ GetHashCodes เป็นต้น
George Mavritsakis

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
ใช่ ... นี้เขียนไว้เมื่อครู่; ฉันน่าจะแนะนำ lodash ตอนนี้ด้วย ฉันกำลังพิจารณาที่จะใช้ UnderscoreKO เพื่ออนุญาต lodash แต่ฉันไม่แน่ใจว่าฉันยอมรับว่าการประเมินแบบขี้เกียจเป็น "คุณลักษณะ" ที่โดดเด่นของ LINQ ส่วนใหญ่แล้วความชื่นชม LINQ ของฉันคือโดยทั่วไปแล้วมันจะสื่อสารถึงเจตนาที่ดีกว่าวิธีอื่นในการทำสิ่งต่างๆ เพียงแค่ความคิด ในอัตราใด ๆ ทั้งห้องสมุดที่ดี
แมทธิวนิโคลส์

4

โดยส่วนตัวแล้วฉันพบว่าสหภาพการดำเนินการ LINQ / set, Intersect, except และ Distinct บน enumerables ใน. 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 อาร์เรย์สาธารณูปโภคนอกจากนี้ยังสามารถติดตั้งโดยใช้ซุ้ม ฉันต้องการเพิ่มข้อจำกัดความรับผิดชอบที่ฉันสร้างปลั๊กอินขึ้นมา :)
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 เป็น JavaScript ด้วยชื่อไวยากรณ์และวิธีการที่คล้ายกัน อย่างไรก็ตามในชุมชน JS ห้องสมุดที่ได้รับความนิยมมากและให้การทำงานเดียวกันUnderscore.js


2

ฉันได้ลองใช้สิ่งเหล่านี้เกือบทั้งหมดแล้วและฉันชอบ $ linq: http://jscriptlinq.codeplex.com/ที่สุด มันทำงานในแบบที่คุณคาดหวังให้ c # linq ทำงานได้ - รวมถึงความสามารถของโซ่


1

ฉันกำลังมองหาอะไรแบบนี้ด้วยตัวเองและเจอ ...

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

นี่ดูดีจริงๆ! บางทีฉันอาจจะไม่เข้าใจจุดของ Rx และสิ่งที่สังเกตได้เมื่อเทียบกับการตั้งค่าตัวจัดการเหตุการณ์ผ่าน jQuery


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.