2013-08-10 3 views
5

मानक जावास्क्रिप्ट में underscore.js की कार्यक्षमता को फिर से कार्यान्वित करने के लिए प्रोग्रामिंग चुनौती पर काम करना। विशेष रूप से मैं _.some फ़ंक्शन को लागू करने पर काम कर रहा हूं। (http://underscorejs.org/#some) जिस भाग के साथ मैं संघर्ष कर रहा हूं वह मुझे _.every आंतरिक रूप से उपयोग करने के लिए हल करने का तरीका ढूंढ रहा है। (http://underscorejs.org/#every)_.every का उपयोग कर _.some को कैसे हल करें?

मैंने पहले से ही _.every फ़ंक्शन पहले ही समाप्त कर लिया है और यह काम करता है जैसा कि यह करना चाहिए।

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, !truthStatementFunction)) 
} 

या अंग्रेजी में, सच्चाई बयान परीक्षण करने के लिए जहां हालत झूठी है फ्लिप ... और अगर _.every परीक्षण तो सच रिटर्न:

यहाँ है कि मैं क्या sketched कोड में करना चाहते हूँ तार्किक है ... तो हम जानते हैं कि _.s मूल सत्य कथन का कुछ गलत है (इसलिए के लिए सही वापसी प्राप्त करने के लिए _.every की वापसी को फ़्लिप करें)। इसी तरह _.every झूठी वापसी करता है तो _.some के लिए सही की सही वापसी प्राप्त करने के लिए फ़्लिप करें।

स्पष्ट रूप से इस स्केच के साथ समस्या !truthStatementFunction भाग है। फ़ंक्शन के आंतरिक भाग को फ़्लिप करने के लिए मैं उस इटरेटर को अंदर कैसे प्राप्त करूं? नहीं लगता है कि समारोह के आंतरिक भागों से सुलभ हैं ...

मैं पूरी तरह गलत पेड़ भौंकने कर रहा हूँ, और वहाँ _.every का उपयोग कर इस को हल करने के लिए एक बेहतर तरीका है?

+1

आपको सही विचार मिला। हालांकि, आपको 'compose] (https://en.wikipedia.org/wiki/Function_composition) '!' ऑपरेटर और फ़ंक्शन की आवश्यकता है; यह 'function (x) {return! trueStatementFunction (x)} की तरह कुछ है, बस 'सत्य स्टेटमेंट फ़ंक्शन' के बजाय। –

+1

अपने प्रश्न का उत्तर देने के लिए ... यह एक सीखने का अभ्यास है, इसलिए बिंदु सीखना है, एक तरफ या दूसरा (हालांकि मुझे पता है कि इसे अपने आप पर 100% हल करना सीखने का सबसे प्रभावी तरीका होगा, बहुत लंबे समय तक अटक जाना और समय बर्बाद करना कि मैं अन्य समान रूप से उपयोगी चीजों को सीखने में खर्च कर सकता हूं, मुझे कोई अच्छा नहीं लगता)। मैं एक सही जवाब के बजाय यहाँ एक संकेत प्राप्त करना पसंद करूंगा, लेकिन मुझे यकीन नहीं था कि क्या यह स्टैक ओवरफ्लो के कड़े नियमों से दूर होगा। – jjj

उत्तर

9

पास _every एक समारोह है कि truthStatementFunction से परिणाम का एक उलट देता है:

_.some = function(collection, truthStatementFunction) { 
    return !(_every(collection, function(v) { 
     return !truthStatementFunction(v); 
    })); 
} 

अपने प्रश्न के दूसरे भाग का जवाब करने के लिए:

और वहाँ का उपयोग कर इस को हल करने के लिए एक बेहतर तरीका है _।प्रत्येक?

वहाँ निश्चित रूप से _.every का उपयोग करने से इस को हल करने के लिए एक बेहतर तरीका है। संग्रह पर बस पुन: प्रयास करें, और जैसे ही आपको मिलान करने वाला कोई तत्व मिल जाए, उतना ही सही हो जाए। उन मामलों में अधिक कुशलता जहां _.some सच होने जा रहा है, क्योंकि आप वास्तव में परवाह नहीं करते हैं कि संग्रह में कितने तत्व भविष्यवाणी को संतुष्ट करते हैं, जब तक कम से कम एक होता है।

_.some = function(c, pred) { 
    for(var i = 0; i < c.length; i++) { 
     if (pred(c[i])) return true; 
    } 
    return false; 
} 
+0

धन्यवाद! उन सभी क्षेत्रों के साथ मैं देख रहा था कि मैं भूल गया था कि मैं स्पष्ट रूप से उस कार्य को परिभाषित कर सकता हूं जिसे मैं _.every में भेज रहा था (_. हर कोई चुनौती को पूरा करने के लिए आंतरिक रूप से _.reduce का उपयोग कर रहा है, इसलिए स्कॉप्स थोड़ा भ्रमित हो रहा है !) अंत में मैं पूछ रहा था कि क्या _every का उपयोग करने का कोई बेहतर तरीका नहीं है, हर किसी का उपयोग न करें ... मैं सहमत हूं कि लूप के लिए यह सब कुछ आसान होगा! – jjj

+0

@ggg कारण मैं लूप के लिए सुझाव दे रहा था सादगी नहीं बल्कि दक्षता थी। '_.every' दृष्टिकोण का उपयोग करना * सरल पुनरावृत्ति की तुलना में बहुत * धीमा (औसत पर) है। –

संबंधित मुद्दे