জাভাস্ক্রিপ্টে স্ট্রিং মেলানোর জন্য স্টেটমেন্ট পরিবর্তন করুন


193

নিম্নলিখিত শর্তসাপেক্ষে আমি কীভাবে একটি সুইচ লিখব?

যদি ইউআরএল থাকে "foo বিন্যাস", তারপরে settings.base_url "বার" হয়।

নিম্নলিখিতটি প্রয়োজনীয় প্রভাবটি অর্জন করছে তবে আমার মনে হচ্ছে এটি একটি স্যুইচে আরও পরিচালনাযোগ্য হবে:

var doc_location = document.location.href;
var url_strip = new RegExp("http:\/\/.*\/");
var base_url = url_strip.exec(doc_location)
var base_url_string = base_url[0];

//BASE URL CASES

// LOCAL
if (base_url_string.indexOf('xxx.local') > -1) {
    settings = {
        "base_url" : "http://xxx.local/"
    };
}

// DEV
if (base_url_string.indexOf('xxx.dev.yyy.com') > -1) {
    settings = {
        "base_url" : "http://xxx.dev.yyy.com/xxx/"
    };
}

উত্তর:


352

আপনি switchযদি পুরো স্ট্রিং ম্যাচিং না করেন তবে আপনি এটিতে পারবেন না ; এটা সাবস্ট্রিং ম্যাচিং করছে । (এটি বেশ নয় সত্য নয়, শন মন্তব্যগুলিতে উল্লেখ করেছেন। শেষে নোট দেখুন))

আপনি যদি খুশি হন যে শীর্ষে আপনার রেজেক্স আপনার ম্যাচে যা তুলনা করতে চান না তা সরিয়ে ফেলছে, আপনার কোনও স্ট্রিং ম্যাচের দরকার নেই এবং এটি করতে পারেন:

switch (base_url_string) {
    case "xxx.local":
        // Blah
        break;
    case "xxx.dev.yyy.com":
        // Blah
        break;
}

... তবে আবার, এটি কেবল তখনই কাজ করে যদি আপনার সম্পূর্ণ মিলটি মিলছে। এটি যদি ব্যর্থ হয় তবে base_url_stringবলুন, "yyy.xxx.local" তবে আপনার বর্তমান কোডটি "xxx.local" শাখায় মিলবে।


আপডেট : ঠিক আছে, সুতরাং প্রযুক্তিগতভাবে আপনি সাবস্ট্রিং ম্যাচিংয়ের জন্য একটি ব্যবহার করতে পারেন switch, তবে আমি বেশিরভাগ ক্ষেত্রেই এটির প্রস্তাব দেব না। কীভাবে ( সরাসরি উদাহরণ ) এখানে:

function test(str) {
    switch (true) {
      case /xyz/.test(str):
        display("• Matched 'xyz' test");
        break;
      case /test/.test(str):
        display("• Matched 'test' test");
        break;
      case /ing/.test(str):
        display("• Matched 'ing' test");
        break;
      default:
        display("• Didn't match any test");
        break;
    }
}

এটি জাভাস্ক্রিপ্টের switchবিবৃতিগুলি যেভাবে কাজ করে , বিশেষত দুটি মূল দিকগুলির কারণে কাজ করে: প্রথমত, কেসগুলি উত্স পাঠ্য ক্রমে বিবেচনা করা হয় এবং দ্বিতীয়টি যে নির্বাচক এক্সপ্রেশনগুলি (কীওয়ার্ডের পরে বিটগুলি case) সেই অভিব্যক্তি যা সেই কেস হিসাবে মূল্যায়ন করা হয় are মূল্যায়ন (অন্য কয়েকটি ভাষার মতো ধ্রুবক নয়)। সুতরাং যেহেতু আমাদের পরীক্ষার এক্সপ্রেশনটি হ'ল true, তার ফলে প্রথম caseপ্রকাশের ফলাফলটি trueব্যবহার হবে।


91
আমি জানি এটি পুরানো, তবে এটি সত্য নয় - আপনি আসলেই করতে পারেনswitch(true) { case /foo/.test(bar): ....
সান কিনসে

23
হায় খোদা, না! স্যুইচ স্টেটমেন্টের মতো কাজ করার কথা নয়। এটি কেবল ভাঙা, এটির মতো জিনিস করা অবৈধ হওয়া উচিত।
পাইজুসন

47
হুহু, এত সুস্বাদু মন্দ।
আদিত্য এমপি

41
আপনার সকলকে আপনার দৃষ্টিভঙ্গি আরও প্রশস্ত করতে হবে। রুবিতে এটি নিয়ম, trueসেখানে কুৎসিত না হওয়া ছাড়া আপনি এটিকে সব একসাথে ছেড়ে যান।
emkman

49
আমি এটি ভালবাসি এবং আমি এটি স্বীকার করতে লজ্জা পাচ্ছি না।
খ্রিস্ট

65

RegExp ইনপুট স্ট্রিংয়ে ব্যবহার করা যেতে পারে কেবল প্রযুক্তিগতভাবেই নয় তবে ব্যবহারিকভাবে match পদ্ধতিতেও।

কারণ আউটপুট match()একটি অ্যারে হয় আমাদের ফলাফলের প্রথম অ্যারে উপাদানটি পুনরুদ্ধার করতে হবে। ম্যাচ ব্যর্থ হলে ফাংশনটি ফিরে আসে null। একটি ব্যতিক্রম ত্রুটি এড়াতে আমরা ||প্রথম অ্যারে উপাদান অ্যাক্সেস করার আগে শর্তসাপেক্ষ অপারেটর যুক্ত করব এবং নিয়মিত অভিব্যক্তির স্থিতিশীল সম্পত্তি হ'ল ইনপুট স্ট্রিং রয়েছে এমন inputসম্পত্তিটির বিরুদ্ধে পরীক্ষা করব ।

str = 'XYZ test';
switch (str) {
  case (str.match(/^xyz/) || {}).input:
    console.log("Matched a string that starts with 'xyz'");
    break;
  case (str.match(/test/) || {}).input:
    console.log("Matched the 'test' substring");        
    break;
  default:
    console.log("Didn't match");
    break;
}

আর একটি পদ্ধতি হল String()কনস্ট্রাক্টরকে ফলাফলযুক্ত অ্যারেতে রূপান্তর করতে ব্যবহার করা যা কেবলমাত্র 1 টি উপাদান (কোনও ক্যাপচারিং গ্রুপ নয়) থাকতে পারে এবং পুরো স্ট্রিংকে অবশ্যই স্ট্রিনে কোয়ানটিফায়ার ( .*) দিয়ে ক্যাপচার করতে হবে । ব্যর্থতার ক্ষেত্রে nullঅবজেক্টটি "null"স্ট্রিং হয়ে যাবে । সুবিধাজনক না.

str = 'haystack';
switch (str) {
  case String(str.match(/^hay.*/)):
    console.log("Matched a string that starts with 'hay'");
    break;
}

যাই হোক, একটি আরো মার্জিত সমাধান ব্যবহার করা /^find-this-in/.test(str)সঙ্গে switch (true)পদ্ধতি যা কেবল একটি বুলিয়ান মান এবং এটি যদি সংবেদনশীলতা ছাড়া অনুসন্ধান করা আরো সহজ।


1
pribilinsiky: আপনার সম্ভবত উল্লেখ করা উচিত যে আপনার তৃতীয় সমাধান (পরীক্ষা () ব্যবহার করে) আপনার স্যুইচ (সত্য) হওয়া দরকার।
ট্রেডে

35

কেবলমাত্র অবস্থানের জন্য ব্যবহার করুন। সর্বশেষ সম্পত্তি

switch (location.host) {
    case "xxx.local":
        settings = ...
        break;
    case "xxx.dev.yyy.com":
        settings = ...
        break;
}

1
ধন্যবাদ, আমার পছন্দসই এটি হিসাবে +1 করা উচিত
ডাঃ ফ্রাঙ্কেনস্টাইন

আপনি পরিবর্তনশীল টাইপটি স্যুইচ স্টেটমেন্টে পাস করার বিষয়ে আপনাকে যত্ন নিতে হবে। এটি অবশ্যই একটি স্ট্রিং হওয়া উচিত । আপনি করতে পারেন তা নিশ্চিত switch ("" + location.host)
50 এ সিভ করা

16

আরেকটি বিকল্প হ'ল inputএকটি রেজিপ্লেক্স ম্যাচের ফলাফলের ক্ষেত্রটি ব্যবহার করা :

str = 'XYZ test';
switch (str) {
  case (str.match(/^xyz/) || {}).input:
    console.log("Matched a string that starts with 'xyz'");
    break;
  case (str.match(/test/) || {}).input:
    console.log("Matched the 'test' substring");        
    break;
  default:
    console.log("Didn't match");
    break;
}

সুন্দর. .length:
এক্ষেত্রে যে

6
var token = 'spo';

switch(token){
    case ( (token.match(/spo/) )? token : undefined ) :
       console.log('MATCHED')    
    break;;
    default:
       console.log('NO MATCH')
    break;;
}


-> ম্যাচটি তৈরি করা হলে ত্রৈমাসিক প্রকাশটি মূল টোকেনটি দেয়
----> আসল টোকেন কেস দ্বারা মূল্যায়ন করা হয়

-> ম্যাচটি যদি না হয় ত্রৈমাসিক রিটার্ন অপরিশোধিত হয়
----> কেস অনির্ধারিত বিরুদ্ধে টোকেনকে মূল্যায়ন করে যা আশা করি আপনার টোকেনটি নয়।

আপনার ক্ষেত্রে উদাহরণস্বরূপ ত্রৈমাসিক পরীক্ষা যে কোনও কিছু হতে পারে

( !!~ base_url_string.indexOf('xxx.dev.yyy.com') )? xxx.dev.yyy.com : undefined 

===========================================

(token.match(/spo/) )? token : undefined ) 

একটি ত্রৈমাসিক অভিব্যক্তি।

এই ক্ষেত্রে পরীক্ষাটি হ'ল টোকেন.ম্যাচ (/ স্প / /) যা রেজেক্স এক্সপ্রেশন / স্প / / (এই ক্ষেত্রে আক্ষরিক স্ট্রিং স্পপ) এর বিপরীতে টোকনে স্ট্রিংটি মেলে বলে।

যদি অভিব্যক্তি এবং স্ট্রিংটি এটির সাথে মিলে যায় তবে এটি সত্যে আসে এবং টোকেন দেয় (যা সেই স্ট্রিং যা স্যুইচ স্টেটমেন্টটি কাজ করছে)।

স্পষ্টতই টোকেন === টোকেন তাই স্যুইচ স্টেটমেন্টটি মিলে যায় এবং কেসটি মূল্যায়ন হয়

আপনি যদি স্তরগুলিতে এটি দেখেন এবং বুঝতে পারেন যে টার্নারি টেস্টটি "পূর্বে" স্যুইচ বিবৃতিটি মূল্যায়ন করা হয় যাতে স্যুইচ বিবৃতি কেবল পরীক্ষার ফলাফলগুলিই দেখে।


আপনার উত্তর বিভ্রান্তিকর। আপনি উদাহরণ এবং ব্যাখ্যাটি পর্যালোচনা এবং উন্নত করতে পারেন?
falsarella

@ ফালসারেল্লা আমি যে অংশটি কল্পনা করেছিলাম তা ব্যাখ্যা করেছিলাম আপনার বুঝতে সমস্যা হয়েছে। আমি মনে করি না আমি আরও সহজ উদাহরণ বানাতে পারি। আপনার আরও প্রশ্ন থাকলে বা আপনার সমস্যাগুলির সাথে আরও সুনির্দিষ্ট করতে পারলে আমি আরও সাহায্য করতে পারি।
জেমস

ঠিক আছে, এখন আমি এটি পেয়েছি। আমি বিভ্রান্ত ছিলাম কারণ এটি সুস্পষ্ট যে token.match(/spo/)এটি মিলবে।
falsarella

3

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

  • প্রথমে নিয়মিত অক্ষরের মধ্যে একটি স্ট্রিং ধরুন
  • এর পরে "কেস" সন্ধান করুন

:

// 'www.dev.yyy.com'
// 'xxx.foo.pl'

var url = "xxx.foo.pl";

switch (url.match(/\..*.\./)[0]){
   case ".dev.yyy." :
          console.log("xxx.dev.yyy.com");break;

   case ".some.":
          console.log("xxx.foo.pl");break;
} //end switch

সম্মত। তবে দ্রষ্টব্য:TypeError: url.match(...) is null
1111161171159459134

1

খুব দেরী হতে পারে এবং সমস্ত, তবে ক্ষেত্রে ক্ষেত্রে এই কাজটি আমি পছন্দ করেছি :)

function extractParameters(args) {
    function getCase(arg, key) {
        return arg.match(new RegExp(`${key}=(.*)`)) || {};
    }

    args.forEach((arg) => {
        console.log("arg: " + arg);
        let match;
        switch (arg) {
            case (match = getCase(arg, "--user")).input:
            case (match = getCase(arg, "-u")).input:
                userName = match[1];
                break;

            case (match = getCase(arg, "--password")).input:
            case (match = getCase(arg, "-p")).input:
                password = match[1];
                break;

            case (match = getCase(arg, "--branch")).input:
            case (match = getCase(arg, "-b")).input:
                branch = match[1];
                break;
        }
    });
};

আপনি ইভেন্টটিকে আরও এগিয়ে নিয়ে যেতে পারেন, এবং বিকল্পের একটি তালিকা পাস করতে পারেন এবং |


1
আমি সুরক্ষার জন্যও পরিবর্তন || {}করতে চাই || [-1]বা তার অনুরূপ হব । এছাড়াও, কেন new RegExpব্যবহার করা হয়, কেবল স্ল্যাশ নয়?
সের্গেই ক্র্যাসিল্নিকভ

এটি পরিমার্জন করতে সত্যিই সময় নি নি .. যে মুহুর্তে এটি কাজ করেছে আমি ঠিক চালিয়েছি ..... আমি এখন লজ্জা বোধ করছি।
TacB0sS

আতঙ্কিত হবেন না, এটি ছিল আমার নিছক বাছাই;) বাস্তবে আমি নিশ্চিত নই যে আমি ঠিক আছি, আমি স্মথ নতুন শিখার চেষ্টা করেছি।
সের্গেই ক্র্যাসিলনিকভ

না ... আপনি ঠিক বলেছেন ... আমি অবশ্যই উদার এবং প্রিট্টিফাই করতে পারতাম .. আমি আবার যখন এই কোডটি পেয়ে যাব তখনই তাড়াতাড়ি যথেষ্ট হবে আশা করি :)
TacB0sS
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.