জাভাস্ক্রিপ্ট: সুইচ ক্ষেত্রে একটি শর্ত ব্যবহার করে


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
আপনি যদি এটি করতে চান তবে তার পরিবর্তে বিবৃতি ব্যবহার করুন ..
নাফতালি ওরফে নীল

4
আপনাকে ifs ব্যবহার করতে বলছে এমন প্রত্যেককে উপেক্ষা করা উচিত নয় , কারণ তারা সঠিক। এটি একটি ভয়ানক প্রয়োগ switch
লিংকলঙ্ক

আমি বিশ্বাস করতে পারি না যে এই সমাধানটি সরবরাহ করা হয়নি। আপনি এটি করতে পারেন, বিবৃতিটি কেবল স্যুইচ অনুচ্ছেদে মানটি মূল্যায়ন করতে হবে। সুতরাং এটি কাজ করবে: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। এটি পরিষ্কার করার জন্য আমি এখানে প্রথম বন্ধনী যুক্ত করেছি, তবে এগুলি আপনার অভিব্যক্তির জটিলতার উপর নির্ভর করে optionচ্ছিক।

এটি বেশ সহজ এবং একটি ঝরঝরে উপায় (যদি আপনি যা করার চেষ্টা করছেন তার সাথে এটি ফিট করে) শর্তগুলির একটি দীর্ঘ সিরিজ পরিচালনা করার, যেখানে সম্ভবত একটি দীর্ঘ সিরিজ ìf() ... else if() ... else if () ...প্রচুর ভিজ্যুয়াল শোরগোল বা ভঙ্গুরতার পরিচয় দিতে পারে।

সাবধানতার সাথে ব্যবহার করুন, কারণ এটি বৈধ কোড হওয়া সত্ত্বেও এটি একটি মানহীন প্যাটার্ন।


9
আমার মনে হয় আপনার দরকার আছে switch(true) {, এবং case liCount == 0:ঠিক আছে? অন্যথায় এই তুলনা হয় liCount == (liCount <=5 && liCount > 0)
লগানফস্মিথ

33
তুমি জানো, এটা কারণ আপনার নয় পারেন যে আপনার উচিত । এটি এমন একটি জিনিস যা আগুন দিয়ে হত্যা করা দরকার।
জেবার্ট

21
এটি ভাষার অংশ - ফলস্বরূপ, এটি সম্পর্কে জেনে রাখা ভাল না। স্পষ্টতই, এটি প্রতিটি পরিস্থিতির পক্ষে উপযুক্ত হবে না তবে খাঁটি বিষয়গত স্তরে আমি মনে করি এটি একটি আকর্ষণীয় পদ্ধতির এবং এই ক্ষেত্রে আইএফ / এলিফগুলির একটি সিরিজের চেয়ে আরও সুস্পষ্ট / কম ভঙ্গুর। গুরুত্বপূর্ণ বিষয়টি মনে রাখবেন যে কোডিং হ'ল অভিপ্রায়, স্বাদ এবং অনুশীলনের সাথে মিলিত। কোডে নিজেকে স্পষ্টভাবে প্রকাশ করার জন্য আরও বিকল্প থাকা কখনও খারাপ জিনিস নয়।
dmp

4
আমার পক্ষে এটি খুব দরকারী এবং আমার যুক্তিটি সংগঠিত করার খুব সুন্দর উপায় যেখানে আমাকে একটি শর্তের উপর ভিত্তি করে বার বার পরিবর্তনশীল নামটি ব্যবহার করার দরকার ছিল, তবে এটি একটি এন + 1 ধরণের দৃশ্যের ছিল তাই সত্য যে সুইচ স্টেটমেন্ট কেস ছাড়া সত্য নীচে পরবর্তী লাইনে একটি বিরতি স্থানান্তরিত হবে সমালোচনামূলকভাবে দরকারী।
জোসেফ আস্ট্রাহান

4
এমনকি আপনি আমাদের চোখ খুললেন তা দেখার জন্য কী কী ফলাফল হত যদি স্যুইচ এক্সপ্রেশনটি এর মতো মিথ্যা হয় switch(false) { }
bello hargbola

24

আপনি যেভাবে overcomplicated হয়েছে। পরিবর্তে এটি বিবৃতি যদি এটি লিখুন:

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

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

বা, যদি কওসপ্যান্ডিওন যথাসম্ভব অপ্টিমাইজ করার চেষ্টা করছে:

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

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

আপনাকে যেতে হবে এবং আমাকে এক আপ করতে হবে। :)
কেওসপ্যান্ডিয়ন

আমরা একই সাথে আমাদের পোস্ট লিখেছি। আমি ইতিমধ্যে পোস্ট না করা অবধি আপনার দেখিনি। আপনি এখন এটি অত্যধিক করছেন বলে মনে হচ্ছে ...
এরিক

বাহ আমি অতিমাত্রায় জটিল শর্তসাপেক্ষ সম্পর্কে ভাবি নি।
কেওসপ্যান্ডিয়ন

4
@ চাওস: হ্যাঁ, এটি সম্ভবত এটি অতিরিক্ত মাত্রাতিরিক্ত। আপনাকে setLayoutStateপাশাপাশি নাল-চেক যুক্ত করতে হবে : পি।
এরিক

@ এরিক - কিছু প্রোগ্রামার তাদের বেল্টের অধীনে আরও বেশি প্রোগ্রামিং ল্যাপযুক্ত আমি বলার অপেক্ষা রাখে না: "কেবলমাত্র আপনি ব্রেস ছাড়াই জাভাস্ক্রিপ্ট লিখতে পারেন (এবং - প্রকৃতপক্ষে যত্ন সহকারে - সেমিকোলনস) এর অর্থ এই নয় যে আপনার উচিত উচিত", তবে আমি কেবল কয়েকটি একাধিক আবার লিখেছি যদি আপনার উদাহরণ হিসাবে যেমন বিবৃতি যাইহোক, তাই ধন্যবাদ - শর্তের পরে কার্যকর করার জন্য একাধিক লাইন না হওয়া পর্যন্ত কাজ করে। ত্রৈমাসিক সমাধানটি আমার জন্য খুব দূরে একটি সেতু ছিল, যদিও…
ডেভ এভারিট

7

আপনি যদি বিবৃতি ব্যবহার করতে চান:

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

7

দেখুন ঢাকা মহানগর পুলিশের উত্তর নিচে। আমি যদি এই উত্তরটি মুছে ফেলতাম তবে মুছে ফেলতাম, তবে এটি গ্রহণ করা হয়েছিল তাই এটি পরবর্তী সেরা জিনিস :)

আপনি পারবেন না। জেএস ইন্টারপ্রেটারদের আপনার স্যুইচ স্টেটমেন্টের সাথে তুলনা করা প্রয়োজন (যেমন কোনও "কেস যখন" স্টেটমেন্ট নেই)। আপনি যদি সত্যিই এটি করতে চান তবে আপনি কেবল if(){ .. } else if(){ .. }ব্লক তৈরি করতে পারেন ।


9
এটা ভুল। এখানে এটি প্রদর্শন করে একটি ডেমো রয়েছে: jsfiddle.net/Eender/fr3wL । এর নাম ECMAScript প্রমিত স্পষ্টভাবে বলে যে, এই অনুমোদিত: docstore.mik.ua/orelly/webprog/jscript/ch06_05.htm#FOOTNOTE-18
Ender

4
@ ইন্ডার কীভাবে হামেস যা করার চেষ্টা করছে তা একই রকম?
আইস্টিনা

@ আস্তিনা এটি নয় যেহেতু তার মামলার শর্তগুলি একটি সংখ্যাসূচক মানের চেয়ে সত্য / মিথ্যা মান উত্পন্ন করে, তাই হেমসের সংখ্যার মূল্যের বিরুদ্ধে পরীক্ষা না করে সত্যবাদী মূল্য (যেমন ড্যানপের উত্তর দ্বারা প্রস্তাবিত) জন্য তার মামলাগুলি পরীক্ষা করা দরকার ছিল liCount। আমি কেবল ইঙ্গিত করছিলাম যে "জেএস ​​ইন্টারপ্রেটারদের ক্ষেত্রে স্ট্যাটিক মান হওয়ার ক্ষেত্রে কেস স্টেটমেন্ট প্রয়োজন" মূল বক্তব্যটি ভুল ছিল। cwolves এই বিবৃতিটি সংশোধন করেছে, সুতরাং আমার মন্তব্যটি আর প্রাসঙ্গিক নয়।
Ender

কারণ এটি প্রশ্নের উত্তর দেয় না। তিনি এটি করার জন্য অন্য কোনও উপায়ে জিজ্ঞাসা করেননি, তিনি সুইচ-কেসকে নিজের মতো করে কাজ করতে বলেছিলেন। "এটি অন্য কোনও উপায়ে করুন" প্রায়শই সঠিক উত্তর নয় আমাদের সত্ত্বেও প্রায়শই এটি মনে হয়। আমরা সবসময় মনে করি আমাদের আরও ভাল উপায় আছে, তবে তিনি কীভাবে এটি করতে চান তা এই উত্তরটি ঠিক স্পষ্টত ভুল করে তুলেছে।
জুঁই

@ জেসমিন - "আপনি পারবেন না, তাই এটি অন্য কোনও উপায়ে করতে পারেন" সঠিকভাবে যদি এটি বৈধ হয় । আমার উত্তরটি নিখরচায়িত হচ্ছে কারণ এটি ঠিক ভুল :) যেমন @ এডানপ নির্দেশ করেছেন, আপনি কেবল তার বিরুদ্ধে যেতে পারেন trueএবং এটি কার্যকর হয় can তবে এটি 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 ব্যতীত অন্য কোনও পূর্ণসংখ্যা সত্যবাদী মান হিসাবে বিবেচিত হবে এবং শর্তে প্রবেশের অনুমতি দেবে। নিশ্চিত নয় যে এখানে কী হয়েছে তাতে তিনি বিবৃতি স্যুইচ করেছেন।
পারদীপ জৈন

4
@ পারদীপজাইন, switchসহজভাবে কাজ করে না ififপরীক্ষার কিনা অবস্থা truthyswitchপরীক্ষার পর অভিব্যক্তি কিনা switchহয় ===( CaseClauseIsSelected ধাপ 4 পরে মত প্রকাশের মান) case
মাইক স্যামুয়েল

ওহহ, ধন্যবাদ। এটি আমার কাছে সম্পূর্ণ নতুন ছিল was @ মাইক
পারদীপ জৈন


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

যদি সম্ভাব্য মানগুলি পূর্ণসংখ্যা হয় তবে আপনি কেস আপ করতে পারেন। অন্যথায়, ifs ব্যবহার করুন।

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.