मेरे सशर्त बयानों को छोटा कैसे करें


154

मेरे पास निम्नलिखित की तरह बहुत लंबा सशर्त बयान है:

if(test.type == 'itema' || test.type == 'itemb' || test.type == 'itemc' || test.type == 'itemd'){
    // do something.
}

मैं सोच रहा था कि क्या मैं इस अभिव्यक्ति / कथन को और अधिक संक्षिप्त रूप में प्रतिबिंबित कर सकता हूं।

इसे प्राप्त करने के बारे में कोई विचार?


23
आप उन्हें एक सरणी में रख सकते हैं और उपयोग कर सकते हैं in?
जेरेमी


अब केवल अगर कोई जांच कर सकता है कि कौन सा सबसे तेज़ है
मुहम्मद उमेर

3
यह शायद हर किसी के लिए एक झटका है लेकिन ओपी के पास गति में एक स्पष्ट विजेता है !!!!!!! हो सकता है कि ब्राउज़र इसके लिए बहुत अधिक अनुकूलन करता हो .. परिणाम: (1) यदि साथ ||। (२) switchकथन। (३) रेगेक्स। (४) ~jsperf.com/if-statements-test-techsin
मुहम्मद उमेर

3
आप भी इस गलत तरीके से संपर्क कर रहे होंगे। इस मामले में, उन 4 प्रकारों में कुछ सामान्य है। यह क्या है? यदि हम इसे अधिक चरम मामले में ले जाते हैं, तो क्या होगा यदि हमें इस स्थिति से मेल खाने के लिए 10 और प्रकारों को जोड़ना होगा। या 100? यदि अधिक होते, तो आप शायद इस समाधान का उपयोग करने पर विचार नहीं करते, या किसी अन्य ने सुझाव दिया। यदि आप इस तरह के बयान को देख रहे हैं, और यह एक कोड गंध है, जो एक अच्छा संकेत है। इसे और अधिक संक्षिप्त बनाने का आपका सबसे अच्छा तरीका होगा यदि आप लिख सकते हैं यदि (test.your_common_condition)। इस संदर्भ में समझना आसान है, और अधिक विस्तार से।
gmacdougall

जवाबों:


241

अपने मूल्यों को एक सरणी में रखें, और जांचें कि क्या आपका आइटम सरणी में है:

if ([1, 2, 3, 4].includes(test.type)) {
    // Do something
}

यदि आपके द्वारा समर्थित ब्राउज़र में Array#includesविधि नहीं है , तो आप इस पॉलीफ़िल का उपयोग कर सकते हैं ।


~टिल्ड शॉर्टकट की संक्षिप्त व्याख्या :

अद्यतन: चूंकि अब हमारे पास includesविधि है, इसलिए ~अब हैक का उपयोग करने का कोई मतलब नहीं है। बस इसे यहां उन लोगों के लिए रखना जो यह जानने में रुचि रखते हैं कि यह कैसे काम करता है और / या दूसरे के कोड में इसका सामना किया है।

इसके बजाय पता चल सके कि परिणाम की की indexOfहै >= 0, वहाँ एक अच्छी छोटी शॉर्टकट है:

if ( ~[1, 2, 3, 4].indexOf(test.type) ) {
    // Do something
}

यहाँ बेला है: http://jsfiddle.net/HYJvK/

यह कैसे काम करता है? यदि कोई आइटम सरणी में पाया जाता है, तो indexOfउसका सूचकांक लौटाता है। यदि आइटम नहीं मिला, तो यह वापस आ जाएगा -1। बहुत अधिक विस्तार में जाने के बिना, ~एक है बिटवाइज़ नहीं ऑपरेटर है , जो 0केवल के लिए वापस आ जाएगा-1

मुझे ~शॉर्टकट का उपयोग करना पसंद है , क्योंकि यह रिटर्न वैल्यू पर तुलना करने से अधिक रसीला है। मैं चाहता हूं कि जावास्क्रिप्ट में एक in_arrayफ़ंक्शन होगा जो सीधे बूलियन (पीएचपी के समान) देता है, लेकिन यह सिर्फ इच्छाधारी सोच है ( अपडेट करें) अब यह करता है।includes । ऊपर देखें)। ध्यान दें कि inArrayPHP के विधि हस्ताक्षर को साझा करते समय jQuery का , वास्तव में देशी indexOfकार्यक्षमता की नकल करता है (जो कि विभिन्न मामलों में उपयोगी है, यदि सूचकांक वही है जो आप वास्तव में हैं)।

महत्वपूर्ण नोट: टिल्ड शॉर्टकट का उपयोग करना, विवाद में सजी जा करने के लिए के रूप में कुछ लगता है जोरदार मानना है कि कोड स्पष्ट पर्याप्त नहीं है और हर कीमत (इस जवाब पर टिप्पणी देखें) में बचा जाना चाहिए। यदि आप उनकी भावना को साझा करते हैं, तो आपको .indexOf(...) >= 0समाधान से चिपके रहना चाहिए ।


थोड़ा लंबा स्पष्टीकरण:

जावास्क्रिप्ट में पूर्णांक पर हस्ताक्षर किए गए हैं, जिसका अर्थ है कि बाएं-बिट बिट साइन बिट के रूप में आरक्षित है; यह इंगित करने के लिए कि क्या संख्या सकारात्मक है या नकारात्मक है, 1नकारात्मक होने के साथ एक ध्वज ।

यहां 32-बिट बाइनरी प्रारूप में कुछ नमूना सकारात्मक संख्याएं हैं:

1 :    00000000000000000000000000000001
2 :    00000000000000000000000000000010
3 :    00000000000000000000000000000011
15:    00000000000000000000000000001111

अब यहाँ वही संख्याएँ हैं, लेकिन नकारात्मक:

-1 :   11111111111111111111111111111111
-2 :   11111111111111111111111111111110
-3 :   11111111111111111111111111111101
-15:   11111111111111111111111111110001

नकारात्मक संख्याओं के लिए ऐसे अजीब संयोजन क्यों? सरल। एक ऋणात्मक संख्या केवल धनात्मक संख्या + 1 का विलोम है; ऋणात्मक संख्या को धनात्मक संख्या में जोड़ने पर हमेशा उपज प्राप्त करनी चाहिए0

इसे समझने के लिए, आइए कुछ सरल द्विआधारी अंकगणित करें।

यहां बताया -1गया है +1:

   00000000000000000000000000000001      +1
+  11111111111111111111111111111111      -1
-------------------------------------------
=  00000000000000000000000000000000       0

और यहां बताया -15गया है +15:

   00000000000000000000000000001111      +15
+  11111111111111111111111111110001      -15
--------------------------------------------
=  00000000000000000000000000000000        0

हम उन परिणामों को कैसे प्राप्त करते हैं? नियमित रूप से जोड़कर, जिस तरह से हमें स्कूल में पढ़ाया गया था: आप सही-सबसे कॉलम पर शुरू करते हैं, और आप सभी पंक्तियों को जोड़ते हैं। यदि योग सबसे बड़ी एकल-अंक संख्या (जो दशमलव में है) से अधिक है9 , लेकिन बाइनरी में है 1) से अधिक है, तो हम शेष को अगले कॉलम पर ले जाते हैं।

अब, जैसा कि आप देखेंगे, जब एक ऋणात्मक संख्या को उसके धनात्मक संख्या में जोड़ते हैं, तो सबसे दायाँ स्तंभ जो 0हमेशा नहीं है 1, हमेशा दो s होगा, जो एक साथ जोड़े जाने पर परिणाम होगा 2। दो होने का द्विआधारी प्रतिनिधित्व 10, हम 1अगले कॉलम पर ले जाते हैं , और 0पहले कॉलम में परिणाम के लिए डालते हैं । बाईं ओर के अन्य सभी स्तंभों में केवल एक ही पंक्ति होती है 1, इसलिए 1पिछले कॉलम से आगे ले जाए गए को फिर से जोड़ा 2जाएगा, जो बाद में ले जाएगा ... यह प्रक्रिया तब तक खुद को दोहराती है जब तक हम बाएं-सबसे स्तंभ पर नहीं पहुंच जाते, जहां1 खत्म किया जा करने के लिए यह इतना overflows और खो जाता है, कहीं नहीं जाना है, और हम के साथ छोड़ दिया रहे हैं 0भर में सब।

इस प्रणाली को 2 का पूरक कहा जाता है । यहां आप इस बारे में और अधिक पढ़ सकते हैं:

हस्ताक्षरकर्ताओं के लिए 2 का पूरक प्रतिनिधित्व


अब जबकि 2 के पूरक में क्रैश कोर्स खत्म हो गया है, तो आप देखेंगे कि -1एकमात्र संख्या जिसका बाइनरी प्रतिनिधित्व है1 सभी के पास है।

~बिटवाइज़ NOT ऑपरेटर का उपयोग करके , दिए गए संख्या में सभी बिट्स उल्टे हैं। पाने का एकमात्र तरीका है0सभी बिट्स inverting से वापस है यदि हम 1सभी के साथ शुरू कर चुके हैं ।

तो, यह सब कहने का एक लंबा-चौड़ा तरीका था जो ~nकेवल तभी वापस आएगा 0यदि nहै -1


59
जब भी बिटवाइज़ ऑपरेटरों का उपयोग करना सुनिश्चित होता है, तब क्या यह वास्तव !== -1में किसी भी बोधगम्य तरीके से बेहतर है ? स्पष्ट रूप से बूलियन तर्क शून्य के फालसे-नेस का उपयोग करने की तुलना में अधिक उपयुक्त नहीं है?
फिल

21
अच्छी तरह से तकनीकी, लेकिन मुझे यह पसंद नहीं है। यह पहली नज़र में स्पष्ट नहीं है कि कोड क्या कर रहा है, जो इसे अस्वीकार्य बनाता है। मैं बहुत "यूरी गैलेन्टर" का जवाब पसंद करता हूं।
जॉन री

65
-1 नए प्रोग्रामर इस तरह से उत्तर देखते हैं, सोचते हैं कि यह कोडिंग का एक अच्छा और स्वीकार्य तरीका है, फिर 5 साल में मुझे उनके कोड को बनाए रखना होगा और अपने बालों को फाड़ना होगा
BlueRaja - Danny Pflughoeft

23
यह मुहावरा निश्चित रूप से सी #, जावा, या पायथन जैसी भाषाओं में आम नहीं है, जो मेरी विशेषज्ञता के क्षेत्र हैं। और मैंने अभी यहां कुछ स्थानीय जावास्क्रिप्ट विशेषज्ञों से पूछा, और उनमें से किसी ने भी इसे पहले कभी नहीं देखा है; इसलिए यह स्पष्ट रूप से उतना सामान्य नहीं है जितना कि आप दावा करते हैं। यह हमेशा बहुत स्पष्ट और अधिक आम के पक्ष में बचा जाना चाहिए != -1
ब्लूराजा - डैनी पफ्लुगुएफ्ट

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

242

आप गिर के साथ स्विच स्टेटमेंट का उपयोग कर सकते हैं:

switch (test.type) {

  case "itema":
  case "itemb":
  case "itemc":
  case "itemd":
    // do something
}

9
इसकी मूल रूप से अगर की तरह ही है, सरणी विधि का सूचकांक कहीं बेहतर है
NimChimpsky

6
@kojiro दुख की बात है, सही जवाब यह है, लेकिन इसकी असंभव के बजाय भयानक बिटवॉइस-सरणी चाल पर ध्यान देना असंभव है।
मनु ३४३ Man२६

1
मुझे पता था कि यह उत्तर यहां होना था लेकिन मुझे इसे खोजने के लिए नीचे की ओर स्क्रॉल करना पड़ा। यह बिल्कुल वैसा ही है जैसे स्विच स्टेटमेंट को कई अन्य भाषाओं के लिए डिज़ाइन किया गया है। मैंने पाया है कि बहुत से लोग स्विच स्टेटमेंट में 'फॉल थ्रू' विधि के बारे में नहीं जानते हैं।
जिमी जॉनसन

3
यह समाधान फ़ायरफ़ॉक्स और सफारी पर सबसे तेज़ है और ||क्रोम पर दूसरा सबसे तेज़ (मूल के बाद ) है। Jsperf.com/if-statements-test-techsin
pabouk

3
मुझे लगता है कि यह एक तरह से लिखने के लिए भयानक होगा यदि आपके पास कई शर्तें थीं ... यह कुछ शर्तों के लिए ठीक है, लेकिन 10 से अधिक के लिए मैं कोड को साफ रखने के लिए सरणी के लिए जाऊंगा।
यु_ओमिनाई

63

विज्ञान का उपयोग करना: आपको वह करना चाहिए जो आईडीएफए ने कहा है और यह सबसे तेज गति के लिए है जबकि कोड को छोटा रखें:

इस तेजी से ~विधि है

var x = test.type;
if (x == 'itema' ||
    x == 'itemb' ||
    x == 'itemc' ||
    x == 'itemd') {
    //do something
}

http://jsperf.com/if-statements-test-techsin यहां छवि विवरण दर्ज करें (शीर्ष सेट: क्रोम, निचला सेट: फ़ायरफ़ॉक्स)

निष्कर्ष:

यदि संभावनाएं हैं कुछ और आप जानते हैं कि कुछ लोगों को एक से अधिक आप अधिकतम प्रदर्शन के बाहर निकलने के होने की संभावना है if ||, switch fall throughऔरif(obj[keyval])

यदि संभावनाएं कई हैं , और उनमें से कोई भी सबसे अधिक होने वाला हो सकता है, तो दूसरे शब्दों में, आप यह नहीं जान सकते हैं कि आपको सबसे अधिक प्रदर्शन ऑब्जेक्ट लुकअप से बाहर होने की संभावना है if(obj[keyval])और regexयदि वह फिट बैठता है तो कौन सा सबसे अधिक होने की संभावना है ।

http://jsperf.com/if-statements-test-techsin/12

अगर कुछ नया आता है तो मैं अपडेट करूंगा।


2
एक बहुत अच्छी पोस्ट के लिए +1! अगर मैं सही तरीके switch caseसे समझूं तो सबसे तेज़ तरीका है?
user1477388

1
फ़ायरफ़ॉक्स हाँ में, क्रोम मेंif ( ...||...||...)...
मुहम्मद उमर

8
यदि आप वास्तव में इस इनपुट पर कई लूप करते हैं, तो यह तेज़ है, लेकिन यदि आप एक बड़े एन (आइटम "स्ट्रिंग्स" की संख्या) के साथ एक लूप है तो यह बहुत धीमा है। मैंने इस कोड जनरेटर को हैक किया है जिसे आप सत्यापित करने के लिए उपयोग कर सकते हैं (या शायद खंडन)। obj["itemX"]अगर n बड़ा है तो बहुत तेज है। मूल रूप से, क्या तेजी से संदर्भ पर निर्भर करता है। मज़े करो।
कोजीरो

3
तो यह सबसे तेज़ तरीका है, लेकिन क्या इससे कोई फर्क पड़ता है ?
कॉंगसबोंगस

1
@ जो गति के लिए कोड की लालित्य बलिदान नहीं करते हैं। ऐसा कई लोग आपसे कहेंगे। अंत में, बस सामान्य ज्ञान का उपयोग करें।
आंद्रे फिग्यूएरेडो

32

यदि आप तार की तुलना कर रहे हैं और एक पैटर्न है, तो नियमित अभिव्यक्तियों का उपयोग करने पर विचार करें।

अन्यथा, मुझे संदेह है कि इसे छोटा करने का प्रयास सिर्फ आपके कोड को बाधित करेगा। बस सुंदर बनाने के लिए लाइनों को लपेटने पर विचार करें।

if (test.type == 'itema' ||
    test.type == 'itemb' ||
    test.type == 'itemc' ||
    test.type == 'itemd') {
    do something.
}


1
यह विस्तार करने के लिए भी आसान है जब परियोजना रखरखाव मोड में जाती है (जैसे नियमों के साथ (test.type == 'itemf' && foo.mode == 'detailed')) ,
इज़काता

16
var possibilities = {
  "itema": 1,
  "itemb": 1,
  "itemc": 1,
…};
if (test.type in possibilities) {  }

किसी वस्तु को साहचर्य सरणी के रूप में उपयोग करना एक बहुत ही सामान्य बात है, लेकिन चूंकि जावास्क्रिप्ट में एक देशी सेट नहीं है इसलिए आप वस्तुओं को सस्ते सेट के रूप में भी उपयोग कर सकते हैं।


यह सामान्य से छोटा कैसे है यदि कथन है कि फ्लाइंगकैट छोटा करने की कोशिश कर रहा है?
dcarson

1
ifयदि आप सभी व्हाट्सएप को हटाते हैं तो @dcarson OP के बयान की स्थिति में 78 अक्षर होते हैं। मेरा 54 लेता है यदि आप इसे इस प्रकार लिख: test.type in {"itema":1,"itemb":1,"itemc":1,"itemd":1}। मौलिक रूप से, उनके प्रत्येक अतिरिक्त उपयोग के लिए प्रत्येक दो खदान के लिए चार वर्णों का उपयोग किया जाता है।
कोजिरो

1
लेकिन आप कर सकते हैं: यदि (संभावनाएं [test.type]) और पूरे 2 वर्णों को बचाएं! :)
dc5

15
if( /^item[a-d]$/.test(test.type) ) { /* do something */ }

या यदि आइटम उस वर्दी नहीं हैं, तो:

if( /^(itema|itemb|itemc|itemd)$/.test(test.type) ) { /* do something */ }

9
"कुछ लोग, जब एक समस्या का सामना करते हैं, तो सोचते हैं कि 'मुझे पता है, मैं नियमित अभिव्यक्ति का उपयोग करूंगा।" अब उन्हें दो समस्याएं हैं। '' - जेमी ज़विंस्की, 1997
मोशे काट्ज़

5
@MosheKatz जबकि मैं समझ सकता हूं कि लोग उस बोली के बारे में बात करना पसंद करते हैं - और लोग निश्चित रूप से पूरी तरह से अनुपयुक्त चीजों के लिए नियमित अभिव्यक्ति का उपयोग करते हैं, लेकिन यह उनमें से एक नहीं है। ओपी द्वारा प्रदान किए गए मामले में, यह न केवल मानदंडों से मेल खाता है, यह बहुत अच्छी तरह से करता है। नियमित अभिव्यक्ति स्वाभाविक रूप से बुराई नहीं है, और अच्छी तरह से परिभाषित मापदंडों के साथ तार का मेल है जो इसके लिए बनाया गया है।
Thor84no

3
@ Thor84no आमतौर पर, मुझे लगता है कि प्रश्नकर्ता वास्तव में पहले मामले के रूप में इस तरह के एक वंचित उदाहरण के खिलाफ मैच का प्रयास नहीं कर रहा है, और यह कि वास्तविक-दुनिया के मैच इतने सरल नहीं हैं, जिस स्थिति में मुझे नहीं लगता कि एक RegEx जा रहा है इसे करने का सही तरीका है। इसे दूसरे तरीके से रखने के लिए, यदि आपका RegEx सिर्फ एक पाइप-चरित्र से अलग विकल्पों की सूची है, तो यह किसी भी अन्य सुझावों की तुलना में अधिक पठनीय नहीं है, और संभवतः काफी कम कुशल है।
मोशे काट्ज़

10

उत्कृष्ट उत्तर, लेकिन आप किसी फ़ंक्शन में उन्हें लपेटकर कोड को अधिक पठनीय बना सकते हैं।

यह जटिल है यदि कथन, जब आप (या कोई और) एक वर्षों में कोड पढ़ते हैं, तो आप यह समझने के लिए कि क्या हो रहा है, अनुभाग को खोजने के लिए स्कैन कर रहे होंगे। इस स्तर के व्यावसायिक तर्क के साथ एक बयान आपको कुछ सेकंड के लिए ठोकर खाने का कारण बनेगा जबकि आप जो परीक्षण कर रहे हैं वह बाहर काम करते हैं। जहां कोड इस तरह है, आपको स्कैनिंग जारी रखने की अनुमति देगा।

if(CheckIfBusinessRuleIsTrue())
{
    //Do Something
}

function CheckIfBusinessRuleIsTrue() 
{
    return (the best solution from previous posts here);
}

अपने फ़ंक्शन को स्पष्ट रूप से नाम दें ताकि यह तुरंत स्पष्ट हो जाए कि आप क्या परीक्षण कर रहे हैं और आपका कोड स्कैन और समझने में बहुत आसान होगा।


1
सबसे अच्छा जवाब मैंने यहां देखा है। वास्तव में, मैं देखता हूं कि लोग अच्छे डिजाइन के सिद्धांतों की परवाह नहीं करते हैं। बस जल्दी से कुछ ठीक करना चाहते हैं और कोड में सुधार करना भूल जाते हैं ताकि भविष्य में सिस्टम को बनाए रखा जा सके!
Maykonn

कैसे के बारे में सिर्फ टिप्पणी की तरह // CheckIfBusinessRuleIsTrue?
daniel1426

4

आप सभी उत्तर एक जावास्क्रिप्ट सेट में डाल सकते हैं और फिर .contains()सेट पर कॉल कर सकते हैं।

आपको अभी भी सभी सामग्रियों को घोषित करना है, लेकिन इनलाइन कॉल कम होगी।

कुछ इस तरह:

var itemSet = new Set(["itema","itemb","itemc","itemd"]);
if( itemSet.contains( test.type ){}

4
ओपी जो करने की कोशिश कर रहा है, उसे पूरा करने के लिए यह अविश्वसनीय रूप से बेकार तरीका है। इसलिए जब आप एक अतिरिक्त 3-पार्टी लाइब्रेरी शामिल कर सकते हैं, तो किसी ऑब्जेक्ट को तत्काल, और उस पर एक कॉल कॉल कर सकते हैं, आपको शायद नहीं करना चाहिए।
KaptajnKold

@ कैप्टेन कोल्ड: वेल ओपी ने कंसीलर के लिए कहा कि मेमोरी फुटप्रिंट नहीं। शायद अन्य कार्यों के लिए सेट का पुन: उपयोग किया जा सकता है?
गुइडो एंसेलमी

1
ज़रूर, लेकिन फिर भी: क्या आप सभी ईमानदारी में कभी ऐसा करेंगे? अगर मैंने कभी इसे जंगली में देखा, तो मैं इसे एक प्रमुख डब्ल्यूटीएफ मानूंगा।
KaptajnKold 12

1
हाँ, आप सही हैं (मैंने आपको + 1s दिया) लेकिन यह मानता है कि यह जाँच कहीं और की जा रही है। यदि यह कई अन्य स्थानों पर किया जा रहा है और / या परीक्षण में बदलाव होता है, तो सेट का उपयोग समझ में आ सकता है। मैं सबसे अच्छा समाधान चुनने के लिए इसे ओपी पर छोड़ देता हूं। सभी ने कहा कि अगर यह एक एकान्त उपयोग था तो मैं सहमत हो जाऊंगा कि सेट का उपयोग करने से शर्म की ऐश जोकर के लायक होगी।
गुइडो एंसेलमी

2
मुझे वास्तव में लगता है कि चुना गया उत्तर बिल्कुल भयानक और बदतर है और फिर सेट का उपयोग करना क्योंकि यह बिल्कुल अपठनीय है।
गुइडो एंसेलमी

2

इसे पूरा करने के मेरे पसंदीदा तरीकों में से एक पुस्तकालय जैसे कि अंडरस्कोर।ज ...

var isItem = _.some(['itema','itemb','itemc','itemd'], function(item) {
    return test.type === item;
});

if(isItem) {
    // One of them was true
}

http://underscorejs.org/#some


1
containsयकीनन इससे बेहतर समाधान हैsome
डेनिस

1
इसके लिए पुस्तकालय का उपयोग करने की आवश्यकता नहीं है: someEC5 में ऐरे प्रोटोटाइप पर एक फ़ंक्शन है।
KaptajnKold

2
सच है, लेकिन सभी के पास EC5 समर्थन उपलब्ध नहीं है। इसके अलावा, मैं सिर्फ अंडरस्कोर पसंद करता हूं। :)
jcreamer898

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

2

एक और तरीका या एक और भयानक तरीका है जो मैंने पाया है ...

if ('a' in oc(['a','b','c'])) { //dosomething }

function oc(a)
{
  var o = {};
  for(var i=0;i<a.length;i++)  o[a[i]]='';
  return o;
}

बेशक, जैसा कि आप देख सकते हैं कि यह चीजों को एक कदम आगे ले जाता है और उन्हें आसान फॉलो लॉजिक बनाता है।

http://snook.ca/archives/javascript/testing_for_a_v

ऑपरेटरों का उपयोग जैसे ~ && || ((), ()) ~~ तभी ठीक है जब आपका कोड बाद में टूट जाए। आप नहीं जान पाएंगे कि कहां से शुरू करें। तो पठनीयता बड़ी है।

यदि आपको चाहिए तो आप इसे कम कर सकते हैं।

('a' in oc(['a','b','c'])) && statement;
('a' in oc(['a','b','c'])) && (statements,statements);
('a' in oc(['a','b','c']))?statement:elseStatement;
('a' in oc(['a','b','c']))?(statements,statements):(elseStatements,elseStatements);

और अगर आप उलटा करना चाहते हैं

('a' in oc(['a','b','c'])) || statement;

2

केवल switchकथन के बजाय कथन का उपयोग करें if:

switch (test.type) {

  case "itema":case "itemb":case "itemc":case "itemd":
    // do your process
  case "other cases":...:
    // do other processes
  default:
    // do processes when test.type does not meet your predictions.
}

Switch यह भी तेजी से काम करता है एक से अधिक सशर्त की तुलना में if


2

तार की बहुत लंबी सूची के लिए, यह विचार कुछ पात्रों को बचाएगा (यह नहीं कह सकता कि मैं इसे वास्तविक जीवन में सुझाऊंगा, लेकिन यह काम करना चाहिए)।

ऐसा चरित्र चुनें जो आपको पता हो कि आपके test.type में नहीं होगा, इसे एक सीमांकक के रूप में उपयोग करें, उन सभी को एक लंबे स्ट्रिंग में खोजें और खोजें:

if ("/itema/itemb/itemc/itemd/".indexOf("/"+test.type+"/")>=0) {
  // doSomething
}

यदि आपके तार आगे विवश होने लगते हैं, तो आप सीमांकक को भी छोड़ सकते हैं ...

if ("itemaitembitemcitemd".indexOf(test.type)>=0) {
  // doSomething
}

... लेकिन आपको उस स्थिति में झूठी सकारात्मकता से सावधान रहना होगा (जैसे "उभार" उस संस्करण में मेल खाएगा)


2

पठनीयता परीक्षण के लिए एक फ़ंक्शन बनाएं (हाँ, एक पंक्ति फ़ंक्शन):

function isTypeDefined(test) {
    return test.type == 'itema' ||
           test.type == 'itemb' ||
           test.type == 'itemc' ||
           test.type == 'itemd';
}

फिर इसे कॉल करें:


    if (isTypeDefined(test)) {

}
...

1

मुझे लगता है कि इस तरह की स्थिति को लिखते समय 2 उद्देश्य होते हैं।

  1. संक्षिप्तता
  2. पठनीयता

जैसे कभी-कभी # 1 सबसे तेज़ हो सकता है, लेकिन मैं बाद में आसान रखरखाव के लिए # 2 ले लूंगा। परिदृश्य के आधार पर मैं अक्सर वाल्टर के उत्तर की भिन्नता का विकल्प चुनूंगा।

शुरू करने के लिए मेरे पास मेरे मौजूदा पुस्तकालय के हिस्से के रूप में एक विश्व स्तर पर उपलब्ध फ़ंक्शन है।

function isDefined(obj){
  return (typeof(obj) != 'undefined');
}

और फिर जब मैं वास्तव में आपकी तरह एक शर्त चलाना चाहता हूं तो मैं मान्य मानों की सूची के साथ एक वस्तु बनाऊंगा:

var validOptions = {
  "itema":1,
  "itemb":1,
  "itemc":1,
  "itemd":1
};
if(isDefined(validOptions[test.type])){
  //do something...
}

यह स्विच / केस स्टेटमेंट और कुछ अन्य उदाहरणों की तुलना में थोड़ा अधिक क्रिया के रूप में त्वरित नहीं है, लेकिन मुझे अक्सर कोड में कहीं और ऑब्जेक्ट का फिर से उपयोग मिलता है जो काफी काम आ सकता है।

ऊपर दिए गए jsperf नमूनों में से एक पर पिग्गीबैकिंग ने इस परीक्षण और गति की तुलना करने के लिए भिन्नता को जोड़ा। http://jsperf.com/if-statements-test-techsin/6 सबसे दिलचस्प बात यह है कि फ़ायरफ़ॉक्स में कुछ टेस्ट कॉम्बो क्रोम की तुलना में बहुत तेज़ हैं।


1

यह एक सरल लूप के साथ हल किया जा सकता है:

test = {};
test.type = 'itema';

for(var i=['itema','itemb','itemc']; i[0]==test.type && [
    (function() {
        // do something
        console.log('matched!');
    })()
]; i.shift());

हम लूप के पहले खंड का उपयोग आप उन तर्कों को शुरू करने के लिए करते हैं, जिन्हें आप मिलान करना चाहते हैं, दूसरे भाग को लूप को चलने से रोकने के लिए, और तीसरा खंड लूप को अंततः बाहर निकलने का कारण बनता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.