जावास्क्रिप्ट: स्विच मामले में एक शर्त का उपयोग करना


89

उस गूंगे प्रश्न के लिए क्षमा करें। मैं जावास्क्रिप्ट स्विच-केस लैंग्वेज एलिमेंट में किसी केस के लिए किसी शर्त का उपयोग कैसे कर सकता हूं? नीचे दिए गए उदाहरण की तरह, एक मामला मैच होना चाहिए जब चर liCount<= 5 और> 0 है; हालाँकि, मेरा कोड काम नहीं करता है:

switch (liCount) {
    case 0:
        setLayoutState('start');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case (liCount<=5 && liCount>0):
        setLayoutState('upload1Row');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case (liCount<=10 && liCount>5):
        setLayoutState('upload2Rows');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case (liCount>10):
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;                  
}

किसी भी सलाह के लिए धन्यवाद!


4
अगर यू के बजाय ऐसा करना है तो बयानों का उपयोग करें ..
उर्फ नील

3
आपको हर किसी को यह बताने की उपेक्षा नहीं करनी चाहिए ifकि वे सही हैं, क्योंकि वे सही हैं। यह एक भयानक अनुप्रयोग है switch
lincolnk

मैं विश्वास नहीं कर सकता कि यह समाधान प्रदान नहीं किया गया है। आप ऐसा कर सकते हैं, बयान को स्विच क्लॉज में मूल्य का मूल्यांकन करने की आवश्यकता है। तो यह काम करेगा:var liCount = 2; switch (liCount) { case 0: console.log(0); break; case (liCount<=5 && liCount>0) && liCount: console.log('liCount<=5 && liCount>0'); break; case (liCount<=10 && liCount>5) && liCount: console.log('liCount<=10 && liCount>5'); break; case (liCount>10) && liCount: console.log(liCount); break; }
Noitidart

जवाबों:


291

यह काम:

switch (true) {
    case liCount == 0:
        setLayoutState('start');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case liCount<=5 && liCount>0:
        setLayoutState('upload1Row');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case liCount<=10 && liCount>5:
        setLayoutState('upload2Rows');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case liCount>10:
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;                  
}

इस उत्तर के पिछले संस्करण ने कोष्ठकों को अपराधी माना। सच में, कोष्ठक यहाँ अप्रासंगिक हैं - केवल आवश्यक चीज है switch(true){...}और आपके मामले की अभिव्यक्तियों के लिए बूलियन का मूल्यांकन करना है।

यह काम करता है, क्योंकि हम स्विच को जो मूल्य देते हैं उसका उपयोग तुलना करने के लिए आधार के रूप में किया जाता है। नतीजतन, बूलियन का मूल्यांकन करने वाले केस एक्सप्रेशन भी निर्धारित करेंगे कि कौन सा केस चलाया गया है। यह भी चारों ओर मोड़ सकता है, और पास हो switch(false){..}सकता है और वांछित अभिव्यक्तियाँ सच के बजाय झूठ का मूल्यांकन करती हैं .. लेकिन व्यक्तिगत रूप से उन परिस्थितियों से निपटना पसंद करती हैं जो सत्यता का मूल्यांकन करती हैं। हालांकि, यह काम भी करता है, इसलिए यह समझने के लिए ध्यान देने योग्य है कि यह क्या कर रहा है।

उदाहरण: यदि liCount 3 है, तो पहली तुलना है true === (liCount == 0), जिसका अर्थ है कि पहला मामला गलत है। स्विच फिर अगले मामले पर जाता है true === (liCount<=5 && liCount>0)। यह अभिव्यक्ति सत्य का मूल्यांकन करती है, जिसका अर्थ है कि यह मामला चलाया गया है, और इसे समाप्त करता है break। मैंने इसे स्पष्ट करने के लिए कोष्ठक जोड़ा है, लेकिन आपकी अभिव्यक्ति की जटिलता के आधार पर वे वैकल्पिक हैं।

यह बहुत सरल है, और एक साफ-सुथरा तरीका है (यदि यह आप जो करने की कोशिश कर रहे हैं उसके साथ फिट बैठता है) स्थितियों की एक लंबी श्रृंखला से निपटने के लिए, जहां शायद बहुत लंबी श्रृंखला ìf() ... else if() ... else if () ...दृश्य शोर या नाजुकता का परिचय दे सकती है।

वैध कोड होने के बावजूद सावधानी के साथ उपयोग करें, क्योंकि यह एक गैर-मानक पैटर्न है।


9
मुझे लगता है कि आपके पास switch(true) {और case liCount == 0:सही होने की आवश्यकता होगी ? अन्यथा यह तुलना है liCount == (liCount <=5 && liCount > 0)
loganfsmyth

33
तुम्हें पता है, यह नहीं है क्योंकि आप कर सकते हैं कि आप चाहिए । यह ऐसी चीज है जिसे आग से मारना पड़ता है।
जेर्ट

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

1
मेरे लिए यह बहुत ही उपयोगी था और अपने तर्क को व्यवस्थित करने के लिए एक बहुत अच्छा तरीका था जहाँ मुझे एक if कंडीशन के आधार पर बार-बार एक वैरिएबल नाम का उपयोग करने की आवश्यकता थी, लेकिन यह एक n + 1 प्रकार का परिदृश्य था इसलिए तथ्य यह है कि बिना स्टेटमेंट केस स्विच एक विराम अगली पंक्ति में आगे बढ़ेगा जो गंभीर रूप से उपयोगी था।
जोसेफ एस्ट्राहन

2
आपने यह देखने के लिए हमारी आँखें भी खोल दीं कि अगर स्विच की अभिव्यक्ति झूठी होती है तो परिणाम क्या होगा switch(false) { }
bello hargbola

24

आपने तरीका अधूरा कर लिया है। इस तरह से बयान के साथ इसे लिखें:

if(liCount == 0)
    setLayoutState('start');
else if(liCount<=5)
    setLayoutState('upload1Row');
else if(liCount<=10)
    setLayoutState('upload2Rows');

$('#UploadList').data('jsp').reinitialise();

या, यदि ChaosPandion जितना संभव हो उतना अनुकूलन करने की कोशिश कर रहा है:

setLayoutState(liCount == 0 ? 'start' :
               liCount <= 5 ? 'upload1Row' :
               liCount <= 10 ? 'upload2Rows' :
               null);

$('#UploadList').data('jsp').reinitialise();

तुम्हें जाना था और एक मुझे ऊपर। :)
चाओसपांडियन

हमने अपनी पोस्टें एक साथ लिखी हैं। जब तक मैंने पहले से पोस्ट नहीं किया था, तब तक मैंने तुम्हारा नहीं देखा था। आप इसे अब अति कर रहे हैं ...
एरिक

वाह, मैं वास्तव में अति जटिल परिस्थितियों के बारे में नहीं सोचता था।
कैओसपांडियन

1
@ चेकोस: हाँ, यह शायद यह अति कर रहा है। आपको null-check को भी जोड़ना होगा setLayoutState: P
एरिक

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

7

यदि आप कथन का उपयोग करना चाहते हैं:

if (liCount === 0) {
    setLayoutState('start');
} else if (liCount <= 5) {
    setLayoutState('upload1Row');
} else if (liCount <= 10) {
    setLayoutState('upload2Rows');
}
$('#UploadList').data('jsp').reinitialise();  

7

देखें DMP के जवाब नीचे। अगर मैं कर सकता था तो मैं इस उत्तर को हटा दूंगा, लेकिन इसे स्वीकार कर लिया गया, इसलिए यह अगली सबसे अच्छी बात है :)

आप नहीं कर सकते। जेएस दुभाषियों को आपको स्विच स्टेटमेंट के खिलाफ तुलना करने की आवश्यकता होती है (उदाहरण के लिए "स्टेटमेंट" होने पर कोई मामला नहीं है)। यदि आप वास्तव में ऐसा करना चाहते हैं, तो आप if(){ .. } else if(){ .. }ब्लॉक कर सकते हैं ।


9
यह गलत है। यहां एक डेमो दिखाया गया है जो इसे काम कर रहा है: jsfiddle.net/Ender/fr3wL । ECMAScript मानक में स्पष्ट रूप से कहा गया है कि इसकी अनुमति है: docstore.mik.ua/orelly/webprog/jscript/ch06_05.htm#FOOTNOTE-18
Ender

3
@Ender कैसे हैमसे वही करने की कोशिश कर रहा है?
आइस्टिना

@ ऐस्टिना यह नहीं है। चूँकि उनकी केस की स्थितियाँ संख्यात्मक मान के बजाय एक सही / गलत मान पैदा करती हैं, इसलिए हेमसे को संख्यात्मक मान के विरुद्ध परीक्षण करने के बजाय एक सत्य मूल्य (जैसे कि danp के उत्तर द्वारा सुझाए गए) के लिए अपने मामलों का परीक्षण करने की आवश्यकता होगी liCount। मैं केवल इस बात की ओर इशारा कर रहा था कि मूल कथन का विरोध करता है कि "जेएस दुभाषियों को स्टेटिक स्टेटमेंट्स की आवश्यकता है स्थैतिक मूल्य"। cwolves ने इस कथन को संशोधित किया है, इसलिए मेरी टिप्पणी अब प्रासंगिक नहीं है।
एंड '31

क्योंकि यह सवाल का जवाब नहीं है। उन्होंने ऐसा करने का कोई अलग तरीका नहीं पूछा, उन्होंने स्विच-केस काम करने के लिए कहा जैसे वह चाहते हैं। "इसे कुछ और तरीके से करें" लगभग कभी भी हमारे पास एक सही जवाब नहीं होता है, बहुत ज्यादा हमेशा यह सोचने के बावजूद। हम हमेशा सोचते हैं कि हमारे पास एक बेहतर तरीका है, लेकिन ऐसा नहीं है कि वह इसे कैसे करना चाहते हैं, जिससे यह उत्तर सीधे सादे गलत हो जाता है।
जैस्मीन

@ जैस्मीन - "आप नहीं कर सकते, इसलिए इसे किसी अन्य तरीके से करें" यदि यह सही है , तो यह पूरी तरह से वैध है । मेरे जवाब को वोट दिया जा रहा है क्योंकि यह सिर्फ गलत है :) जैसा कि @danp ने बताया, आप बस के खिलाफ स्विच कर सकते हैं trueऔर यह काम करता है। लेकिन यह 3 साल से अधिक पुराना है, इसलिए मुझे वास्तव में परवाह नहीं है।
मार्क कान

5
switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}

जावास्क्रिप्ट में काम करेंगे जब तक आपकी स्थिति उचित booleanमान लौटाती है, लेकिन else ifबयानों पर इसके कई फायदे नहीं हैं ।


क्या यह काम करेगा अगर मैं 10स्विच स्टेटमेंट में कुछ पूर्णांक कहूं ? मेरे मामले में निश्चित नहीं है कि क्या कारण है।
परदीप जैन

10 !== true, तो नहीं। क्या कुछ चर है जिनका मूल्य हो सकता है 10? अगर x, तब case x === 10:काम करेगा।
माइक सैमुअल

लेकिन यह उदाहरण के लिए अन्य कथनों की तरह काम करना चाहिए यदि आप if (10) {..}प्रवाह का उपयोग करते Ifहैं, तो क्या यह शर्त है? क्योंकि 0 को छोड़कर 10 या किसी भी पूर्णांक को सत्य मान के रूप में माना जाएगा और स्थिति में प्रवेश करने की अनुमति होगी। यकीन नहीं होता कि वह गलत है कि उसने यहां क्या बयान दिया।
परदीप जैन

1
@PardeepJain, switchबस की तरह काम नहीं करता है ififपरीक्षण करता है कि क्या हालत सत्य हैswitchपरीक्षण के बाद अभिव्यक्ति switchहै ===( CaseClauseIsSlectlected चरण 4 ) के बाद अभिव्यक्ति के मूल्य के लिए case
माइक सैमुअल

ओह, उस तरह, धन्यवाद। यह मेरे लिए बिलकुल नया था। @ माइक
जैन

4

यह एक ऐसा मामला है जहां आपको ifक्लॉज़ का उपयोग करना चाहिए ।


4

यदि आप ऐसा करना चाहते हैं, तो ifबयानों का उपयोग करना बेहतर होगा । उदाहरण के लिए:

if(liCount == 0){
    setLayoutState('start');
}
if(liCount<=5 && liCount>0){
    setLayoutState('upload1Row');
}
if(liCount<=10 && liCount>5){
    setLayoutState('upload2Rows');
}             
var api = $('#UploadList').data('jsp');
    api.reinitialise();

2

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

तो, उदाहरण के लिए, कहते हैं liCount = 2। आपका पहला मामला मेल नहीं खाएगा, क्योंकि 2 != 0। आपका दूसरा मामला, का (liCount<=5 && liCount>0)मूल्यांकन करता है true, लेकिन 2 != true, इसलिए यह मामला भी मेल नहीं खाएगा।

इस कारण से, जैसा कि कई अन्य लोगों ने कहा है, आपको if...then...else ifऐसा करने के लिए ब्लॉकों की एक श्रृंखला का उपयोग करना चाहिए ।


2

यदि संभव मान पूर्णांक हैं तो आप मामलों को झुका सकते हैं। अन्यथा, अगर का उपयोग करें।

var api, tem;

switch(liCount){
    case 0:
    tem= 'start';
    break;
    case 1: case 2: case 3: case 4: case 5:
    tem= 'upload1Row';
    break;
    case 6: case 7: case 8: case 9: case 10:
    tem= 'upload2Rows';
    break;
    default:
    break;
}
if(tem) setLayoutState((tem);
api= $('#UploadList').data('jsp');
api.reinitialise();

0

ध्यान दें कि हम स्कोर को स्विच पर पास नहीं करते हैं लेकिन यह सच है। हम स्विच को जो मूल्य देते हैं उसका उपयोग तुलना करने के लिए आधार के रूप में किया जाता है।

नीचे दिए गए उदाहरण से पता चलता है कि हम मामले में शर्तों को कैसे जोड़ सकते हैं: बिना किसी बयान के।

function getGrade(score) {
    let grade;
    // Write your code here
    switch(true) {
        case score >= 0 && score <= 5:
        grade = 'F';
        break;
        case score > 5 && score <= 10:
        grade = 'E';
        break;
        case score > 10 && score <= 15:
        grade = 'D';
        break;
        case score > 15 && score <= 20:
        grade = 'C';
        break;
        case score > 20 && score <= 25:
        grade = 'B';
        break;
        case score > 25 && score <= 30:
        grade = 'A';
        break;
    }

    return grade;
}

0

हालांकि ओपी के प्रश्न के विशेष उदाहरण में, switchउचित नहीं है, एक उदाहरण है जहां स्विच अभी भी उपयुक्त / लाभदायक है, लेकिन अन्य मूल्यांकन अभिव्यक्तियों की भी आवश्यकता है। यह अभिव्यक्ति के लिए डिफ़ॉल्ट क्लॉज का उपयोग करके प्राप्त किया जा सकता है:

switch (foo) {
  case 'bar':
    // do something
    break;
  case 'foo':
    // do something
    break;
  ... // other plain comparison cases
  default:
    if (foo.length > 16) {
      // something specific
    } else if (foo.length < 2) {
      // maybe error
    } else {
      // default action for everything else
    }
}

0

आप स्विच-केस में फ़ॉल-थ्रू विधि का उपयोग कर सकते हैं।

const x = 'Welcome';

switch (x) {
  case 'Come':
    console.log(1)
    break;

  case 'Welcome':
  case 'Wel':
  case 'come':
    console.log(2)
    break;

  case 'Wel':
    console.log(3)
    break;

  default:
    break;
}

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