2015-12-15 9 views
7

में एक विधि के लिए यह सुनिश्चित नहीं है कि यह शब्द कितना बेहतर है (और इसके परिणामस्वरूप, पिछले उत्तरों नहीं मिल सका, हालांकि मुझे उम्मीद है कि इसका उत्तर पहले दिया गया है), लेकिन मुझे इस बात की रूचि है कि कोड को चालू करने का कोई तरीका है या नहीं इस:सशर्त रूप से लागू करें! जावास्क्रिप्ट

if (this.props.mailboxFilter == 'sent') { 
    return this.currentUser.canActOnBehalfOf(m.senderID); 
} else { 
    return !this.currentUser.canActOnBehalfOf(m.senderID); 
} 

नीचे की तरह कुछ (यकीन नहीं है कि यह कैसे बेहतर व्यक्त करने के लिए) के लिए: के रूप में में

var bangOrNot = this.props.mailboxFilter == 'sent ? '!' : ''; 
bangOrNot(this.currentUser.canActOnBehalfOf(m.senderID)); 

, वहाँ एक रास्ता बढ़ाया अगर/किसी और वाक्य रचना और सभी पुनरावृत्ति से बचने की है यह चुनकर कि return लाइन को बैंग के साथ कॉल करना है या नहीं?

+1

समाधान आपके तर्क में कहीं और हो सकता है। क्या आप वास्तव में अनुमतियों के विपरीत भेजना चाहते हैं? यह अजीब लगता है। – isherwood

उत्तर

9

आप अन्य तरीकों से इसे आसान बनाने सकता है:

var response = this.currentUser.canActOnBehalfOf(m.senderID); 
return this.props.mailboxFilter == 'sent' ? response : !response; 

सामान्य तौर पर, यदि आप इस विधि से बचने के लिए अपने कार्य में किसी भी राज्य को परिवर्तित करता है चाहेंगे। हालांकि, इस मामले में आप इसे बिना किसी पर कॉल कर रहे हैं, इसके मूल्य को पहले कैशिंग करने में कोई हानि नहीं है।

-4

मान लें कि आप जावास्क्रिप्ट का उपयोग कर रहे हैं, आप जावास्क्रिप्ट कोड की स्ट्रिंग का मूल्यांकन करने के लिए eval विधि का उपयोग कर सकते हैं। आप सशर्त रूप से स्ट्रिंग के सामने बैंग लागू कर सकते हैं और फिर eval का परिणाम वापस कर सकते हैं।

+1

ऐसा मत करो ... – Lucas

+0

क्यों नहीं? यह आपको चुनौती नहीं देना है मैं गंभीरता से उत्सुक हूं। –

+0

ईवल ईविल है ... –

5

यदि this.currentUser.canActOnBehalfOf(m.senderID) हर जगह एक बूलियन मान देता है, तो आप एक्सओआर कर सकते हैं।

return (this.props.mailboxFilter != 'sent')^this.currentUser.canActOnBehalfOf(m.senderID); 

XOR true साथ एक बूलियन मान एक नहीं बनाता है। और false के साथ एक्सओआर एक बफर बनाता है जो एक ही मूल्य को बनाए रखता है।

ध्यान दें कि मैंने == को != में बदल दिया है।

और, सुनिश्चित करें कि आप कोड के इस हिस्से पर टिप्पणियां डालते हैं यदि आप वास्तव में इसका उपयोग करने जा रहे हैं। थोड़ी देर बाद इस कोड को पढ़ना इतना आसान नहीं है।

अद्यतन

Bergi के रूप में सुझाव दिया है, यह बूलियन XOR != उपयोग करने के लिए एक बूलियन मान वापस जाने के लिए बेहतर है।

return (this.props.mailboxFilter != 'sent') != this.currentUser.canActOnBehalfOf(m.senderID); 

और निश्चित रूप से अगर यह रूप में अच्छी तरह बूलियन XNOR साथ इस्तेमाल किया जा सकता, बस ऊपर कोड में == के साथ दोनों != रों बदलें।

return this.currentUser.canActOnBehalfOf(m.senderID) == (this.props.mailboxFilter == 'sent'); 
+1

यह सबसे कुशल तरीका है। – TbWill4321

+0

मुझे यह पसंद है ... लेकिन आपका भविष्य स्वयं नहीं होगा! बेशक – Xophmeister

+0

@Xophmeister :) एक उपयोग कर सकते हैं अपने काम की सुरक्षा को अधिकतम करने के लिए! कोई और इस कोड को पढ़ नहीं सकता! –

3

आप बूलियन XNOR ऑपरेटर यहाँ का उपयोग करना चाहते। मुझे लगता है कि ओपी के पास फंक्शन कॉल के परिणामस्वरूप बैंग (!) को लागू करना अच्छा कारण है। मेरा जवाब ओपी के प्रश्न के तकनीकी समाधान से अधिक है।

function bang(r) { 
    return !r; 
} 
function notBang(r) { 
    return r; 
} 
function canActOnBehalf() { 
    return true; 
} 
var filter = 'notsent'; 
var f = (filter == 'sent' ? bang : notBang); 
f(canActOnBehalf('whatever')); 
0

कई अच्छे के बारे में क्यों या क्यों इस तरह बात करने के लिए नहीं टिप्पणी नहीं है: भी तुल्यता रूप में जाना -

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