interview - javascript javascript eval atob(' dmf glx



तुलना फ़ंक्शन के साथ जावास्क्रिप्ट में सॉर्ट फ़ंक्शन कैसे काम करता है (4)

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

ex1: तार

var animals = ["Horse", "Cat", "Tiger", "Lion"];  
animals.sort();

ex2: संख्याएं

var marks = [70, 90, 60, 80 ];  
marks.sort(function(a, b){return a > b}); //ascending , a < b descending . 

जैसा कि पहले से ही पूछा गया है: सॉर्ट फ़ंक्शन जावास्क्रिप्ट में compare फ़ंक्शन के साथ कैसे काम करता है? अगर मेरे पास एक सरणी है, और मैं array.sort(compare) करता हूं तो यह पुस्तक में लिखा गया था कि यदि compare फ़ंक्शन ab (सरणी के दो सूचकांक) लौटाता है तो यह इस तथ्य के आधार पर काम करता है कि परिणाम अधिक से अधिक है या नहीं 0, 0 से कम या 0 के बराबर। लेकिन, यह वास्तव में कैसे काम करता है? मैं इसे काम नहीं कर सका।


Answer #1

"तुलना" फ़ंक्शन को दो तर्क लेना चाहिए, जिसे अक्सर और बी के रूप में जाना जाता है। फिर आप इन मानों के आधार पर तुलना फ़ंक्शन 0, 0 से अधिक, या 0 से कम की तुलना करते हैं, और बी

  1. यदि बी से अधिक है तो 0 से अधिक रिटर्न करें
  2. अगर 0 बराबर है तो वापसी करें
  3. यदि बी से कम है तो 0 से कम रिटर्न करें

इन तीन रिटर्न मानों के साथ, और केवल दो तर्कों के साथ, तुलनात्मक फ़ंक्शन लिखना संभव है जो किसी भी प्रकार के इनपुट डेटा प्रकार या जटिल डेटा संरचनाओं को सॉर्ट कर सकता है।

फिर, जब आप अपने कस्टम तुलना फ़ंक्शन के साथ सॉर्ट () को कॉल करते हैं, उचित क्रम निर्धारित करने के लिए तुलना फ़ंक्शन को आपकी टू-सॉर्टेड सूची में जोड़े पर कॉल किया जाता है।

चलिए एक साधारण उदाहरण के माध्यम से चलते हैं ... मान लें कि आप केवल कुछ संख्याओं को क्रमबद्ध कर रहे हैं, इसलिए हमारे पास एक बहुत ही सरल तुलना कार्य है:

function compare(a,b) {
    return a - b;
}

बी से कम होने पर बस बी से बड़े होने पर शून्य से अधिक वापस आना शून्य से अधिक वापस आना, 0 यदि वे बराबर हैं, या शून्य से कम है तो बी से कम है। तो यह एक तुलना समारोह के लिए आवश्यकताओं को पूरा करता है।

अब मान लें कि यह क्रमबद्ध करने के लिए संख्याओं की हमारी सूची है:

var numbers = [1,5,3.14];

जब आप numbers.sort(compare) , आंतरिक रूप से यह वास्तव में निष्पादित होगा:

compare(1,5);     // Returns -4, a is less than b
compare(1,3.14);  // Return -2.14, a is less than b
compare(5,3.14);  // returns 1.86, a is greater than b

यदि आपने कभी मैन्युअल सॉर्टिंग या वर्णमालाकरण किया है, तो आपने ठीक वही काम किया है, शायद इसे महसूस किए बिना। भले ही आपके पास तुलना करने के लिए दर्जन या सैकड़ों आइटम हो, फिर भी आप एक समय में केवल दो संख्याओं (या लेखक के अंतिम नाम, या जो कुछ भी) की तुलना कर रहे हैं। तीन नंबरों के माध्यम से फिर से या छोटी सूची में जाकर, आप पहले दो संख्याओं की तुलना करके शुरू करेंगे:

  1. 1 से अधिक या 5 से कम है? इससे कम, इसलिए इन दो नंबरों को हमारी सूची में रखें: 1,5
  2. 3.14 से अधिक या उससे कम है? इससे बड़ा, इसलिए यह नई सूची में 1 के बाद चला जाता है
  3. क्या हमारी नई सूची में 3.14 से अधिक या 5 से कम है? इससे कम, तो यह 5 से पहले चला जाता है। हमारी नई सूची अब [1,3.14,5] है

चूंकि आप अपनी तुलना () फ़ंक्शन प्रदान कर सकते हैं, इसलिए केवल संख्याओं के आधार पर मनमाने ढंग से जटिल डेटा को सॉर्ट करना संभव है।


Answer #2

मुझे लगता है कि यह ऐसा हो सकता है (ठीक है, मुझे इस बारे में निश्चित नहीं है।):

मान लें कि फ़ंक्शन compare(a,b) तुलना फ़ंक्शन है। यह c देता है। मान लीजिए कि हम सॉर्ट परिणाम सरणी M प्राप्त करने के लिए सरणी N में प्रविष्टियों को सॉर्ट करने जा रहे हैं।

मुझे सटीक सॉर्ट एल्गोरिदम नहीं पता है, और विभिन्न ब्राउज़र भी अलग-अलग परिणाम लौटाते हैं यदि c न तो (ab) और न ही (ba) (कहें, यदि c "b-2" , "a+b" या कुछ अन्य अभिव्यक्तियां हैं) ।

लेकिन ECMA-262 मुताबिक, सॉर्ट परिणाम इस तरह होना चाहिए:

ए, बी इंडेक्स में से कोई भी हो सकता है। इसका मतलब है कि हम वास्तव में एक आदेशित जोड़ी तुलना समारोह में पारित कर दिया। eg: (0,1),(1,4), or even (2,0) , (2,1)

ईसीएमएस्क्रिप्ट भाषा विशिष्टता का कहना है कि परिणाम में यह संपत्ति होनी चाहिए: (a,b) एक आदेशित जोड़ी तुलना फ़ंक्शन में पास की गई है।

  • यदि c (फ़ंक्शन रिटर्न क्या है) शून्य से कम है, तो M(a)< M(b) संतुष्ट होना चाहिए।

और विनिर्देश कुछ भी नहीं करता है कि सी क्या शून्य होगा या शून्य से बड़ा होगा।

मुझे यकीन नहीं है कि यह सही है या नहीं। कम से कम यह आसानी से समझा सकता है कि जब c "ab" , तो प्रविष्टियों को संख्यात्मक रूप से और आरोही होने के क्रमबद्ध किया जाता है, और जब c "ba" , तो प्रविष्टियों को विपरीत में क्रमबद्ध किया जाता है।

क्या ब्राउज़र के जेएस इंजन वास्तव में `ईसीएमए -262 के अनुसार सख्ती से डिजाइन नहीं किए गए हैं या क्या मैं पूरी तरह से गलत हूं?

संदर्भ:

ईसीएमए -262 का पांचवां संस्करण (पृष्ठ 12 9 -130 देखें)


Answer #3

यह विधि Array.sort (तुलना निष्पादन सॉर्टऑप्शन) के क्रम के सिंटैक्स और पैरामीटर का उपयोग करती है, जिनके मानकों को निम्नानुसार परिभाषित किया गया है:

तुलना फ़ंक्शन - सरणी तत्वों के सॉर्ट ऑर्डर को निर्धारित करने के लिए उपयोग की जाने वाली एक तुलना फ़ंक्शन। यह पैरामीटर वैकल्पिक है। दो पैरामीटर की तुलना करने के लिए तुलना फ़ंक्शन का उपयोग किया जाना चाहिए। किसी दिए गए तत्व के ए और बी, तुलना परिणाम का परिणाम नकारात्मक मान, 0 या सकारात्मक मान हो सकता है:

यदि वापसी मूल्य ऋणात्मक है, तो इसका मतलब है कि बी क्रमबद्ध अनुक्रम में बी से पहले प्रकट होता है। यदि वापसी मूल्य 0 है, तो ए और बी के समान क्रम क्रम है। यदि वापसी मूल्य सकारात्मक है, तो इसका मतलब है कि बी क्रमबद्ध अनुक्रम में बी के बाद प्रकट होता है।






javascript