underscore.js - Lodash और अंडरस्कोर के बीच मतभेद




javascript (8)

अगर मुझे पसंद है तो आप अंडरस्कोर और लॉनाश के बीच उपयोग अंतर की सूची की उम्मीद कर रहे थे, अंडरस्कोर से लॉनाश में माइग्रेट करने के लिए एक गाइड है

वंशावली के लिए इसकी वर्तमान स्थिति यहां दी गई है:

  • Underscore _.compose लोडाश _.flowRight
  • अंडरस्कोर _.contains लोडाश _.includes
  • Underscore _.findWhere लोडाश _.find
  • अंडरस्कोर _.invoke लोडाश _.invokeMap
  • Underscore _.mapObject लोडाश _.mapValues
  • अंडरस्कोर _.pluck लोडाश _.map
  • अंडरस्कोर _.where लोडाश _.filter
  • Underscore _.any लोडाश _.some
  • Underscore _.all लोडाश _.every
  • Underscore _.each false वापसी से बाहर निकलने की अनुमति नहीं देता है
  • अंडरस्कोर _.flatten डिफ़ॉल्ट रूप से गहरा है जबकि लोडाश उथला है
  • Underscore _.isFinite साथ संरेखित नहीं है
    (उदाहरण के लिए _.isFinite('1') अंडरस्कोर में true है लेकिन लोडाश में झूठा)
  • Underscore _.matches shorthand गहरी तुलना का समर्थन नहीं करता है
    (उदाहरण के लिए _.filter(objects, { 'a': { 'b': 'c' } }) )
  • अंडरस्कोर ≥ 1.7 और लोडाश ने अपना _.template वाक्यविन्यास बदल दिया है
    _.template(string, option)(data)
  • लोडाश _.uniq अंडरस्कोर जैसे iteratee फ़ंक्शन को स्वीकार नहीं करता है। लोडाश _.uniqBy प्रयोग करें
  • लोडाश _.first और ._last अंडरस्कोर की तरह एक n तर्क स्वीकार नहीं करते हैं। slice प्रयोग करें
  • लोडाश _.memoize कैश ऑब्जेक्ट्स जैसे Map हैं
  • लोडाश निहित चेनिंग , आलसी चेनिंग और शॉर्टकट फ़्यूज़न का समर्थन करता है
  • लोडाश ने इसके अधिभारित _.head , _.last , _.rest , और _.initial आरंभ में विभाजित किया
    _.take , _.takeRight , _.drop , और _.dropRight
    (यानी अंडरस्कोर में _.take(array, 2) में _.take(array, 2) है)

किसी को या तो lodash.js या underscore.js उपयोगिता लाइब्रेरी को दूसरे पर क्यों पसंद करेंगे?

लगता है कि लोडाश अंडरस्कोर के लिए एक ड्रॉप-इन प्रतिस्थापन है, बाद वाला यह लंबे समय से रहा है।

मुझे लगता है कि दोनों शानदार हैं, लेकिन मुझे पर्याप्त जानकारी नहीं है कि वे शिक्षित तुलना करने के लिए कैसे काम करते हैं, और मैं मतभेदों के बारे में और जानना चाहता हूं।


अधिकांश भाग अंडरस्कोर के लिए lodash का सबसेट है। कभी-कभी, वर्तमान में अंडरस्कोर की तरह ठंडे छोटे कार्यों में लॉन्शश के पास नक्शा ऑब्जेक्ट नहीं होता है। इसने मुझे अपनी परियोजना के विकास में बहुत समय बचाया।


मुझे बस एक अंतर मिला जो मेरे लिए महत्वपूर्ण साबित हुआ। Lodash के _.extend() का गैर-अंडरस्कोर-संगत संस्करण कक्षा-स्तर-परिभाषित गुणों या विधियों पर प्रतिलिपि नहीं करता है।

मैंने कॉफीस्क्रिप्ट में जैस्मीन परीक्षण बनाया है जो यह दर्शाता है:

https://gist.github.com/softcraft-development/1c3964402b099893bd61

सौभाग्य से, lodash.underscore.js सब कुछ की प्रतिलिपि बनाने के अंडरस्कोर के व्यवहार को संरक्षित करता है, जो मेरी स्थिति के लिए वांछित व्यवहार था।


मैं यहां पर ज्यादातर चीजों से सहमत हूं लेकिन मैं सिर्फ underscore.js के पक्ष में एक तर्क को इंगित करना चाहता हूं: लाइब्रेरी का आकार।

विशेष रूप से यदि आप एक ऐप या वेबसाइट विकसित कर रहे हैं जो अधिकतर मोबाइल उपकरणों पर उपयोग करने का इरादा रखता है, परिणामी बंडल का आकार और बूट या डाउनलोड समय पर प्रभाव में एक महत्वपूर्ण भूमिका हो सकती है।

तुलना के लिए, इन आकारों को मैंने आयनिक सेवा चलाने के बाद स्रोत-मानचित्र-एक्सप्लोरर के साथ देखा है:

lodash: 523kB
underscore.js: 51.6kb

यकीन नहीं है कि ओपी का मतलब क्या है, लेकिन मैं इस सवाल के पार आया क्योंकि मैं उन मुद्दों की एक सूची खोज रहा था जो मुझे अंडरस्कोर से लॉनाश में माइग्रेट करते समय ध्यान में रखना है।

अगर कोई व्यक्ति इस तरह के मतभेदों की पूरी सूची के साथ एक लेख पोस्ट करता है तो मैं वास्तव में सराहना करता हूं। मुझे उन चीजों से शुरू करने दें जिन्हें मैंने कठिन तरीके से सीखा है (यानी, चीजें जो मेरे कोड को उत्पादन पर विस्फोट कर देती हैं: /):

  • अंडरस्कोर में _.flatten डिफ़ॉल्ट रूप से गहरा है और आपको इसे उथले बनाने के लिए दूसरे तर्क के रूप में सच होना होगा। Lodash में यह डिफ़ॉल्ट रूप से उथला है और दूसरे तर्क के रूप में सच गुजरना इसे गहरा कर देगा! :)
  • _.last में _.last एक दूसरा तर्क स्वीकार करता है जो बताता है कि आप कितने तत्व चाहते हैं। आवास में ऐसा कोई विकल्प नहीं है। आप इसे .slice साथ अनुकरण कर सकते हैं
  • _.first (एक ही मुद्दा)
  • _.template में अंडरस्कोर का उपयोग कई तरीकों से किया जा सकता है, जिनमें से एक टेम्पलेट स्ट्रिंग और डेटा प्रदान कर रहा है और HTML वापस प्राप्त कर रहा है (या कम से कम यह कुछ समय पहले कैसे काम करता है)। lodash आपको एक फ़ंक्शन मिलता है जिसे आपको डेटा के साथ फ़ीड करना चाहिए।
  • _(something).map(foo) अंडरस्कोर में काम करता है, लेकिन lodash में मुझे इसे _.map(something,foo) पर फिर से लिखना पड़ा। शायद वह सिर्फ एक TypeScript इश्यु था

यह 2014 और कुछ साल बहुत देर हो चुकी है। फिर भी मुझे लगता है कि मेरा मुद्दा है:

आईएमएचओ इस चर्चा को काफी हद तक अनुपात से उड़ा दिया गया। उपर्युक्त ब्लॉग पोस्ट का उद्धरण:

अंडरस्कोर, वेलेंटाइन और वू जैसे अधिकांश जावास्क्रिप्ट उपयोगिता पुस्तकालय, "मूल-प्रथम दोहरी दृष्टिकोण" पर भरोसा करते हैं। यह दृष्टिकोण देशी कार्यान्वयन को प्राथमिकता देता है, केवल वेनिला जावास्क्रिप्ट पर वापस आ जाता है यदि मूल समकक्ष समर्थित नहीं है। लेकिन जेएसपेर्फ ने एक दिलचस्प प्रवृत्ति का खुलासा किया: एक सरणी या सरणी जैसे संग्रह को फिर से चलाने का सबसे प्रभावी तरीका मूल कार्यान्वयन से बचने के लिए, सरल लूपों को चुनने के लिए है।

जैसे कि "सरल लूप" और "वेनिला जावास्क्रिप्ट" ऐरे या ऑब्जेक्ट विधि कार्यान्वयन से अधिक मूल हैं। जीज़ ...

यह निश्चित रूप से सच का एक स्रोत होना अच्छा होगा, लेकिन ऐसा नहीं है। यहां तक ​​कि अगर आपको अन्यथा बताया गया है, तो मेरे प्रिय, कोई वेनिला भगवान नहीं है। मुझे माफ कर दो। वास्तव में धारणा है कि एकमात्र धारणा यह है कि हम सभी जावास्क्रिप्ट कोड लिख रहे हैं जिसका उद्देश्य सभी प्रमुख ब्राउज़रों में अच्छा प्रदर्शन करना है, यह जानकर कि उनमें से सभी के पास एक ही चीजों के अलग-अलग कार्यान्वयन हैं। यह हल्के ढंग से रखने के लिए सामना करने के लिए एक कुतिया है। लेकिन यह आधार है, चाहे आप इसे पसंद करते हैं या नहीं।

हो सकता है कि आप बड़े पैमाने पर परियोजनाओं पर काम कर रहे हों, जिनके लिए आकर्षक प्रदर्शन की आवश्यकता है ताकि आप वास्तव में प्रति सेकंड एक सूची में 850,000 (अंडरस्कोर) बनाम 2,500,000 (लॉनाश) पुनरावृत्तियों के बीच अंतर देख सकें !

मैं एक के लिए नहीं हूँ। मेरा मतलब है, मैंने परियोजनाओं पर काम किया जहां मुझे प्रदर्शन के मुद्दों को हल करना पड़ा, लेकिन उन्हें कभी हल नहीं किया गया था या न ही अंडरस्कोर और न ही लो-डैश के कारण। और जब तक कि मैं कार्यान्वयन और प्रदर्शन में वास्तविक मतभेदों को पकड़ नहीं लेता (हम अभी सी ++ से बात कर रहे हैं) चलो एक लापरवाह (ऑब्जेक्ट या सरणी, स्पैस या नहीं!) पर एक लूप कहें, मैं किसी के साथ परेशान नहीं हूं बेंचमार्क प्लेटफ़ॉर्म के परिणामों के आधार पर दावे जो पहले से ही विचार किए गए हैं

इसे केवल एक ही अपडेट की ज़रूरत है कि राइनो ने अपने ऐरे विधि कार्यान्वयन को एक फैशन में सेट करने के लिए कहा है कि एक भी "मध्ययुगीन पाश विधियां बेहतर प्रदर्शन करती हैं और हमेशा के लिए और क्या नहीं" पुजारी साधारण तथ्य के आसपास अपने तरीके से बहस कर सकते हैं कि सभी एफएफ में अचानक सरणी विधियां उसके विचारित मस्तिष्क की तुलना में बहुत तेज हैं। मैन, आप अपने रनटाइम पर्यावरण को धोखा देकर अपने रनटाइम पर्यावरण को धोखा नहीं दे सकते! इसके बारे में सोचें जब प्रचार ...

आपकी उपयोगिता बेल्ट

... अगली बार।

तो इसे प्रासंगिक रखने के लिए:

  • अंडरस्कोर का प्रयोग करें यदि आप मूल आइश बलिदान के बिना सुविधा में हैं।
  • यदि आप सुविधा में हैं और इसकी विस्तारित फीचर कैटलॉग (गहरी प्रति इत्यादि) की तरह लो-डैश का उपयोग करें और यदि आपको तत्काल प्रदर्शन की बेहद जरूरी ज़रूरत है और सबसे महत्वपूर्ण बात यह है कि जैसे ही मूल एपीआई की बाहरीता रायषित workaurounds। जो जल्द ही होने जा रहा है। अवधि।
  • यहां तक ​​कि एक तीसरा समाधान भी है। DIY! अपने वातावरण को जानें। असंगतताओं के बारे में जानें। उनके ( John-David और Jeremy ) कोड पढ़ें। इसका उपयोग न करें या यह समझाए बिना कि एक स्थिरता / संगतता परत वास्तव में क्यों आवश्यक है और आपके वर्कफ़्लो को बढ़ाता है या आपके ऐप के प्रदर्शन में सुधार करता है। यह बहुत संभावना है कि आपकी आवश्यकताएं एक साधारण पॉलीफिल से संतुष्ट हैं कि आप स्वयं को लिखने में पूरी तरह से सक्षम हैं। दोनों पुस्तकालयों में थोड़ी सी चीनी के साथ केवल सादे वेनिला हैं। वे सिर्फ मधुर पाई की सेवा करने वाले व्यक्ति से लड़ते हैं । लेकिन मेरा विश्वास करो, अंत में दोनों ही पानी के साथ खाना पकाने हैं। कोई वेनिला भगवान नहीं है इसलिए कोई वेनिला पोप नहीं हो सकता है, है ना?

चुनें कि जो भी दृष्टिकोण आपकी आवश्यकताओं को सबसे ज्यादा फिट करता है। हमेशा की तरह। मैं किसी भी समय रायटेड रनटाइम चीट्स पर वास्तविक कार्यान्वयन पर फॉलबैक पसंद करूंगा लेकिन यहां तक ​​कि यह आज भी स्वाद का मामला प्रतीत होता है। Http://developer.mozilla.com और http://caniuse.com जैसे गुणवत्ता संसाधनों पर चिपके रहें और आप ठीक होंगे।


http://benmccormick.org/2014/11/12/underscore-vs-lodash/

बेन मैककॉर्मिक द्वारा दो की तुलना में नवीनतम लेख:

  1. लो-डैश का एपीआई अंडरस्कोर का सुपरसैट है।

  2. हुड के तहत [लो-डैश] पूरी तरह से फिर से लिखा गया है।

  3. लो-डैश अंडरस्कोर से निश्चित रूप से धीमी नहीं है।

  4. लो-डैश क्या जोड़ा गया है?

    • उपयोगिता सुधार
    • अतिरिक्त कार्यक्षमता
    • प्रदर्शन लाभ
    • चेनिंग के लिए शॉर्टंड वाक्यविन्यास
    • कस्टम केवल आपको जो चाहिए उसे उपयोग करने के लिए बनाता है
    • अर्थपूर्ण संस्करण और 100% कोड कवरेज

lodash _ _.mapValues() मिला है जो underescore के _.mapObject() के समान है।