কীভাবে আমার শর্তাধীন বিবৃতিগুলি সংক্ষিপ্ত করবেন


154

আমি নীচের মত একটি দীর্ঘ দীর্ঘ শর্তাধীন বিবৃতি আছে:

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

আমি ভাবছিলাম যে আমি এই অভিব্যক্তি / বিবৃতিটিকে আরও সংক্ষিপ্ত আকারে রিফেক্টর করতে পারি কিনা।

এটি কীভাবে অর্জন করা যায় তার কোনও ধারণা?


23
আপনি এগুলিতে একটি অ্যারে রেখে ব্যবহার করতে পারেন in?
জেরেমি


এখন কেবল যদি কেউ পরীক্ষা করতে পারে যে কোনটি সবচেয়ে দ্রুত
মুহাম্মদ উমর

3
এটি হয়ত সবার কাছেই ধাক্কা খায় তবে ওপি যা আছে তা স্পষ্ট বিজয়ী !!!!!!! সম্ভবত ব্রাউজারটি এটির জন্য প্রচুর অনুকূলিতকরণ করে .. ফলাফল: (1) সাথে থাকলে ||। (2) switchবিবৃতি। (3) রেজেক্স (4) ~jsperf.com/if-statements-test-techsin
মুহাম্মদ উমর

3
আপনি এটিও ভুল উপায়ে পৌঁছে যাচ্ছেন। এই ক্ষেত্রে, এই 4 টি ধরণের কিছু মিল রয়েছে। এটা কি? যদি আমরা এটিকে আরও চরম ক্ষেত্রে নিয়ে যাই, তবে এই শর্তটি মেলানোর জন্য আমাদের আরও 10 প্রকার যুক্ত করার দরকার পড়লে কী হয়। নাকি 100? যদি আরও কিছু থাকে, আপনি সম্ভবত এই সমাধানটি ব্যবহার করার বিষয়টি বিবেচনা করবেন না বা অন্য কেউ পরামর্শ দিয়েছেন। আপনি যদি এরকম বিবৃতিটি একটি বড় আকারের দেখতে পাচ্ছেন এবং এটি একটি কোড গন্ধ ভেবে যাচ্ছেন তবে এটি একটি ভাল লক্ষণ। এটি আরও সংক্ষিপ্ত করার সর্বোত্তম উপায় হ'ল আপনি যদি (টেস্ট.ইউর_কমোন_কমিশন) লিখতে পারেন। এই প্রসঙ্গে বোঝা আরও সহজ এবং আরও প্রসারিত।
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। অত্যধিক বিস্তারিত মধ্যে পেয়ে ছাড়া, ~একটি হল bitwise না অপারেটর , যা ফিরে আসবে 0শুধুমাত্র -1

আমি ~শর্টকাটটি ব্যবহার করতে পছন্দ করি , যেহেতু এটি রিটার্ন মানটির সাথে তুলনা করার চেয়ে বেশি সাফল্যযুক্ত। আমি আশা করি জাভাস্ক্রিপ্টের এমন কোনও in_arrayফাংশন রয়েছে যা সরাসরি বুলিয়ান (পিএইচপি এর অনুরূপ) ফিরিয়ে দেয় তবে এটি কেবল ইচ্ছুক চিন্তাভাবনা ( আপডেট: এটি এখন করে It's এটি বলা হয় includesabove উপরে দেখুন)। নোট করুন যে jQuery এর inArrayপিএইচপি এর পদ্ধতি স্বাক্ষর ভাগ করার সময়, প্রকৃতপক্ষে দেশীয় indexOfকার্যকারিতা নকল করে (যা বিভিন্ন ক্ষেত্রে কার্যকর, যদি সূচকটি সত্যিকারের পরে থাকে তবে)।

গুরুত্বপূর্ণ নোট: টিল্ড শর্টকাট ব্যবহার করে, বিতর্ক মধ্যে swathed করা কিছু বলে মনে হয় তীব্রভাবে বিশ্বাস করি যে কোড স্পষ্ট যথেষ্ট নয় এবং সব খরচ (এই উত্তরে মন্তব্য দেখতে) এ এড়িয়ে চলা উচিত। আপনি যদি তাদের অনুভূতিগুলি ভাগ করে নেন তবে আপনার .indexOf(...) >= 0সমাধানটি আটকে থাকা উচিত ।


একটু দীর্ঘ ব্যাখ্যা:

জাভাস্ক্রিপ্টে পূর্ণসংখ্যাগুলি স্বাক্ষরিত হয়, যার অর্থ বাম-সর্বাধিক বিটটি সাইন বিট হিসাবে সংরক্ষিত থাকে; নম্বরটি ধনাত্মক বা negativeণাত্মক কিনা তা চিহ্নিত করার জন্য একটি পতাকা, aণাত্মক 1হচ্ছে।

এখানে 32-বিট বাইনারি বিন্যাসে কিছু নমুনা ধনাত্মক সংখ্যা রয়েছে:

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

এখন those একই নম্বর, কিন্তু নেতিবাচক:

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

Theণাত্মক সংখ্যার জন্য কেন এমন অদ্ভুত সংমিশ্রণ? সহজ। Negativeণাত্মক সংখ্যাটি হ'ল ধনাত্মক সংখ্যার বিপরীত হয় + 1; ইতিবাচক সংখ্যায় নেতিবাচক সংখ্যা যুক্ত করা সর্বদা ফলন করা উচিত 0

এটি বুঝতে, আসুন কয়েকটি সাধারণ বাইনারি পাটিগণিত করি।

এখানে কিভাবে আমরা যোগ হবে -1থেকে +1:

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

এবং এখানে কিভাবে আমরা যোগ হবে -15থেকে +15:

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

কীভাবে আমরা এই ফলাফলগুলি পেতে পারি? নিয়মিত সংযোজন করে, স্কুলে আমাদের যেভাবে শেখানো হয়েছিল: আপনি ডানদিকের সর্বাধিক কলামে শুরু করুন এবং আপনি সমস্ত সারি যুক্ত করেছেন। যোগফল যদি বৃহত্তম একক-অঙ্কের সংখ্যার চেয়ে বেশি হয় (যেটি দশমিক হয় 9তবে বাইনারি হয় 1) আমরা বাকী অংশটি পরবর্তী কলামে নিয়ে যাই।

এখন, আপনি লক্ষ্য করবেন যে, এর ইতিবাচক সংখ্যায় একটি নেতিবাচক সংখ্যা যুক্ত করার সময়, ডান-সর্বাধিক কলামটি যে সবগুলি নয়, 0সর্বদা দু'টি থাকে 1, যা একসাথে যুক্ত হওয়ার পরে ফলাফল হয় 2। দুটি সত্তার বাইনারি প্রতিনিধিত্ব 10, আমরা 1পরের কলামে বহন করি এবং ফলাফলটির 0জন্য প্রথম কলামে একটি রাখি । বাম দিকে অন্য সমস্ত কলামগুলির একটি সহ কেবল একটি সারি রয়েছে 1, সুতরাং 1পূর্ববর্তী কলামটি থেকে বাহিত হওয়া আবার যুক্ত হবে 2, যা পরে বহন করবে ... আমাদের বাম-সর্বাধিক কলামে পৌঁছা পর্যন্ত এই প্রক্রিয়াটি পুনরাবৃত্তি করে, যেখানে 1জের করা এটা এত উপচে এবং হারানো পরার, কোথাও না যেতে আছে, এবং আমরা অবশিষ্ট করছি 0জুড়ে গুলি সব।

এই সিস্টেমটিকে 2 এর পরিপূরক বলা হয় । আপনি এখানে এই বিষয়ে আরও পড়তে পারেন:

স্বাক্ষরিত পূর্ণসংখ্যার জন্য 2 এর পরিপূরক প্রতিনিধিত্ব


এখন 2 এর পরিপূরক ক্র্যাশ কোর্স শেষ হয়ে গেছে, আপনি লক্ষ্য করবেন যে -1একমাত্র সংখ্যা যার বাইনারি উপস্থাপনা 1সর্বত্র জুড়ে।

~বিটওয়াইট নট অপারেটর ব্যবহার করে , প্রদত্ত সংখ্যার সমস্ত বিট উল্টানো হয়। 0সমস্ত বিট উল্টানো থেকে ফিরে আসার একমাত্র উপায় হ'ল যদি আমরা 1সমস্ত জুড়ে শুরু করি ।

সুতরাং, এই সমস্তটি বলার দীর্ঘ পথ ছিল যা ~nকেবল 0যদি ফিরে আসে তবেই ফিরে nআসবে -1


59
বিটওয়াইজ অপারেটরগুলি ব্যবহারের মাধ্যমে নিশ্চিত যে সেক্সি, এটি !== -1কোনও কল্পনাযোগ্য উপায়ে সত্যই কি ভাল ? স্পষ্টত বুলিয়ান যুক্তি শূন্যের মিথ্যা-নেস ব্যবহারের চেয়ে আরও উপযুক্ত নয় কি?
ফিল

21
সুন্দরভাবে প্রযুক্তি, তবে আমি এটি পছন্দ করি না। কোডটি কী করছে তা প্রথম নজরে এটি স্পষ্ট নয়, যা এটি অভাবনীয় করে তোলে। আমি অনেকটা "ইউরি গ্যালান্টার" এর উত্তর পছন্দ করি।
জন রিয়া

65
-1 নতুন প্রোগ্রামারদের এই অনেক বিষয়ে উত্তর দেখুন, মনে হয় এটা 5 বছরের মধ্যে কোডিং এর একটি শীতল ও গ্রহণযোগ্য উপায় হয়, তাহলে আমি তাদের কোড বজায় রাখা এবং বাইরে আমার চুল ছিঁড়ে আছে
ড্যানি Pflughoeft - BlueRaja

23
এই আইডিয়োমটি অবশ্যই সি #, জাভা বা পাইথনের মতো ভাষায় সাধারণ নয়, যা আমার দক্ষতার ক্ষেত্র। এবং আমি এখানে স্থানীয় জাভাস্ক্রিপ্ট বিশেষজ্ঞদের কয়েকজনকে জিজ্ঞাসা করেছি, এবং এর আগে কেউ কখনও এর আগে এটি করতে দেখেনি; সুতরাং এটি আপনার দাবি হিসাবে পরিষ্কারভাবে সাধারণ নয়। এটি সবসময় আরও পরিষ্কার এবং আরও সাধারণের পক্ষে এড়ানো উচিত != -1
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

12
-1 কোনও ভাষায় অপ্রয়োজনীয় বিট ফিডলিংয়ের কারণে যা প্রথমে বিট উপস্থাপনার বিষয়ে খুব বেশি নির্দিষ্ট করে না। এছাড়াও, এই উত্তরটির বেশিরভাগ অংশই বিটফিডলিংয়ের ব্যাখ্যা দিচ্ছে। হ্যাকটি ব্যাখ্যা করতে যদি আপনার 20 অনুচ্ছেদ লিখতে হয় তবে এটি কি আসলেই কোনও সময় বাঁচায়?
ফ্লফি

242

আপনি পতনের মাধ্যমে সুইচ স্টেটমেন্ট ব্যবহার করতে পারেন:

switch (test.type) {

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

9
মূলত এটির মতোই, অ্যারে পদ্ধতির
সূচকটি

6
@ কোজিরো এর দুঃখের বিষয়, সঠিক উত্তরটি এটি, তবে ভয়ঙ্কর বিটহাইস-অ্যারে কৌশলের পরিবর্তে এটির দিকে দৃষ্টি আকর্ষণ করা অসম্ভব।
মনু 343726

1
আমি জানতাম এই উত্তরটি এখানে থাকতে হবে তবে এটি সন্ধান করতে আমাকে নীচের দিকে যেতে হবে। এটি স্যুইচ স্টেটমেন্টটি ঠিক একই জন্য ডিজাইন করা হয়েছিল এবং অন্যান্য অনেক ভাষায় বহন করে। আমি অনেক লোক স্যুইচ বিবৃতিতে 'পড়ে থাকা' পদ্ধতি সম্পর্কে জানি না।
জিমি জনসন

3
এই সমাধানটি ফায়ারফক্স এবং সাফারিতে দ্রুততম এবং ||ক্রোমের দ্বিতীয় দ্রুততম (আসলটির পরে )। Jsperf.com/if-statements-test-techsin

3
আমার মনে হয় আপনার যদি অনেক শর্ত থাকে তবে কোনও পদ্ধতিতে এটি লিখতে ভয়ঙ্কর হবে ... এটি কয়েকটি শর্তের জন্য জরিমানা হলেও 10 এরও বেশিের জন্য আমি কোডটি পরিষ্কার রাখার জন্য অ্যারের কাছে যাব।
yu_ominae

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তবে দ্রুততম পদ্ধতিটি কী?
ব্যবহারকারী 1477388

1
ফায়ারফক্সে হ্যাঁ, ক্রোমে এটিif ( ...||...||...)...
মুহাম্মদ উমার

8
আপনি যদি সত্যিই এই ইনপুটটিতে অনেকগুলি লুপ করেন তবে এটি আরও দ্রুত, তবে আপনার যদি খুব বড় এন ("আইটেমএক্স" স্ট্রিংগুলির সংখ্যার) সাথে একটি লুপ থাকে তবে এটি খুব ধীর হয়। আমি এই কোড জেনারেটরটিকে হ্যাক করেছি যা আপনি যাচাই করতে (বা সম্ভবত খণ্ডন করতে) ব্যবহার করতে পারেন। obj["itemX"]এন বড় হলে অত্যন্ত দ্রুত। মূলত, দ্রুত যা প্রসঙ্গে নির্ভর করে। আনন্দ কর.
কোজির

3
সুতরাং এটি দ্রুততম পদ্ধতি, তবে এটি কোনও বিষয় নয় ?
কংগ্রেসবংগাস

1
@ মিচ কেবল গতির জন্য কোডের কমনীয়তার ত্যাগ করবেন না। এই কথা অনেক লোক আপনাকে বলবে। শেষ পর্যন্ত, কেবল সাধারণ জ্ঞান ব্যবহার করুন।
আন্দ্রে ফিগুয়েরেদো

32

আপনি যদি স্ট্রিংগুলির সাথে তুলনা করছেন এবং কোনও প্যাটার্ন থাকে তবে নিয়মিত এক্সপ্রেশন ব্যবহার করে বিবেচনা করুন।

অন্যথায়, আমি সন্দেহ করি যে এটি সংক্ষিপ্ত করার চেষ্টা করছে এটি কেবল আপনার কোডটি অবলম্বন করবে। এটি সুন্দর করার জন্য কেবল লাইনগুলি মোড়ানো বিবেচনা করুন।

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

4
এই উত্তরটি গতি অনুসারে বিজয়ী jsperf.com/if-statements-test-techsin
মুহাম্মদ উমার

1
প্রকল্পটি রক্ষণাবেক্ষণের মোডে গেলে (যেমন বিধিগুলি সহ (test.type == 'itemf' && foo.mode == 'detailed')) চলে গেলে এটি প্রসারিত করাও সহজ
ইজকাটা

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

সহযোগী অ্যারে হিসাবে কোনও অবজেক্ট ব্যবহার করা একটি দুর্দান্ত সাধারণ জিনিস, তবে জাভাস্ক্রিপ্টের কোনও নেটিভ সেট নেই তাই আপনি সস্তা সেট হিসাবেও অবজেক্টগুলি ব্যবহার করতে পারেন।


ফ্লাইংগ্যাট সংক্ষিপ্ত করার চেষ্টা করছে এমন বিবৃতি যদি স্বাভাবিকের চেয়ে ছোট হয় তবে কীভাবে?
dcarson

1
ifআপনি সমস্ত সাদা স্থান সরিয়ে ফেললে @ ডিকারসন ওপি'র বক্তব্যের শর্তসাপেক্ষে 78 টি অক্ষর লাগে। খনি 54 লাগে যদি আপনি এটা ভালো লিখুন: test.type in {"itema":1,"itemb":1,"itemc":1,"itemd":1}। মূলত, তার প্রতিটি অতিরিক্ত কী জন্য প্রতিটি দুই খনি ব্যবহারের জন্য চারটি অক্ষর ব্যবহার করে।
কোজিরো

1
তবে আপনি এটি করতে পারেন: যদি (সম্ভাব্যতা [পরীক্ষা.প্রকার]) এবং পুরো 2 টি অক্ষর সংরক্ষণ করুন! :)
ডিসি 5

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

বা যদি আইটেমগুলি সেই ইউনিফর্ম না হয় তবে:

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

9
"কিছু লোক যখন সমস্যার মুখোমুখি হয়, তখন মনে হয় 'আমি জানি, আমি নিয়মিত ভাব প্রকাশ করব use' এখন তারা দুটি সমস্যা আছে." - জেমি জাওনস্কি, 1997
মোশে কাটজ

5
@ মোশেকাটজ যদিও আমি বুঝতে পারি যে লোকেরা এই উক্তিটি সম্পর্কে ব্যান্ড করতে পছন্দ করে - এবং লোকেরা অবশ্যই পুরোপুরি অনুপযুক্ত জিনিসের জন্য নিয়মিত অভিব্যক্তি ব্যবহার করে, তবে এটি তাদের মধ্যে একটিও নয়। ওপি কর্তৃক প্রদত্ত ক্ষেত্রে, এটি কেবল মানদণ্ডের সাথে মেলে না, এটি খুব ভাল করে। নিয়মিত প্রকাশগুলি অন্তর্নিহিত দুষ্ট নয় এবং ভাল সংজ্ঞায়িত পরামিতিগুলির সাথে স্ট্রিংগুলির মিল এটির জন্য তৈরি is
Thor84no

3
@ থোর 84no সাধারণত, আমি ধরে নেব যে প্রশ্নকর্তা প্রথম ক্ষেত্রে যেমন একটি স্বতন্ত্র উদাহরণের সাথে মিলের চেষ্টা করছেন না, এবং বাস্তব-বিশ্বের ম্যাচগুলি এত সহজ নয়, সেই ক্ষেত্রে আমি মনে করি না যে কোনও রেজিএক্স চলছে এটি করার সঠিক উপায় হতে। এটি অন্য উপায়ে বলতে গেলে, যদি আপনার RegEx কেবলমাত্র পাইপ-অক্ষর দ্বারা পৃথক করা বিকল্পগুলির তালিকা হয় তবে এটি অন্য কোনও পরামর্শের চেয়ে বেশি পঠনযোগ্য নয় এবং সম্ভবত উল্লেখযোগ্যভাবে কম দক্ষ।
মোশে কাটজ

10

দুর্দান্ত উত্তর, তবে আপনি কোনও একটি ফাংশনে মুড়িয়ে কোডটিকে আরও বেশি পঠনযোগ্য করে তুলতে পারেন।

যদি বিবৃতিটি জটিল হয়, আপনি যখন (বা অন্য কেউ) কয়েক বছরের মধ্যে কোডটি পড়েন, তখন আপনি কী ঘটছে তা বোঝার জন্য বিভাগটি সন্ধান করতে যাচ্ছেন ning ব্যবসায়িক যুক্তির এই স্তরের সাথে একটি বিবৃতি আপনাকে যা পরীক্ষা করছে তা কাজ করার সময় কয়েক সেকেন্ডের জন্য আপনাকে হোঁচট খাচ্ছে। এর মতো কোড হিসাবে, আপনাকে স্ক্যান চালিয়ে যাওয়ার অনুমতি দেবে।

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

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

আপনার ফাংশনটির নাম স্পষ্টভাবে বলুন যাতে আপনি যা যা পরীক্ষা করছেন তা অবিলম্বে স্পষ্ট হয় এবং আপনার কোডটি স্ক্যান করা এবং বুঝতে খুব সহজ হবে to


1
আমি এখানে দেখেছি সেরা উত্তর। সত্যিই, আমি দেখতে পাচ্ছি যে লোকেরা ভাল ডিজাইনের নীতিগুলির বিষয়ে চিন্তা করে না। কেবল দ্রুত কোনও কিছু ঠিক করতে চান এবং কোডটি উন্নত করতে ভুলে যান যাতে ভবিষ্যতে সিস্টেমটি বজায় রাখা যায়!
মায়কন

কীভাবে ঠিক মত মন্তব্য করা যায় // CheckIfBusinessRuleIsTrue?
daniel1426

4

আপনি সমস্ত উত্তর একটি জাভাস্ক্রিপ্ট সেটে রাখতে পারেন এবং তারপরে কেবল কল করতে পারেন.contains() সেটে করতে পারেন।

আপনাকে এখনও সমস্ত বিষয়বস্তু ঘোষণা করতে হবে, তবে ইনলাইন কলটি কম হবে।

কিছুটা এইরকম:

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

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

@ ক্যাপিনেট কোল্ড: ঠিক আছে ওপি সংক্ষিপ্ততার জন্য মেমরির পদক্ষেপের জন্য বলেছিল। হয়তো সেটটি অন্য ক্রিয়াকলাপগুলির জন্য পুনরায় ব্যবহার করা যেতে পারে?
গুইডো আনসেলমি

1
অবশ্যই, তবে তবুও: আপনি কি কখনও সততার সাথে নিজেকে এই কাজটি করবেন? আমি যদি কখনও বন্যগুলিতে এটি দেখতে পেতাম তবে আমি এটিকে একটি বড় ডাব্লুটিএফ বিবেচনা করব।
কাপ্তজনকোল্ড

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
এর জন্য কোনও লাইব্রেরি ব্যবহার করার দরকার নেই: someইসি 5-তে অ্যারে প্রোটোটাইপের একটি ফাংশন।
কাপ্তজনকোল্ড

2
সত্য, তবে প্রত্যেকের কাছে ইসি 5 সমর্থন উপলব্ধ নেই। এছাড়াও, আমি ঠিক আন্ডারস্কোর পছন্দ করি। :)
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

অপারেটর যেমন ~ && || ব্যবহার করে ((), ()) later কেবলমাত্র আপনার কোডটি পরে ব্রেক হয়ে গেলে fine ঠিক আছে। আপনি কোথায় শুরু করবেন তা জানেন না। তাই পাঠযোগ্যতা বিআইজি।

যদি আপনি অবশ্যই এটি আরও খাটো করতে পারেন।

('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

স্ট্রিংগুলির খুব দীর্ঘ তালিকাগুলির জন্য, এই ধারণাটি কয়েকটি অক্ষর সংরক্ষণ করবে (এটি বাস্তব জীবনে সুপারিশ করব না, তবে এটি কার্যকর হবে)।

এমন একটি চরিত্র চয়ন করুন যা আপনি জানেন যা আপনার পরীক্ষায় ঘটবে না pe

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...
}

এটি স্যুইচ / কেস স্টেটমেন্টের মতো দ্রুত এবং অন্য কয়েকটি উদাহরণের চেয়ে কিছুটা ভার্বোজের মতো নয় তবে আমি প্রায়শই কোডটির অন্য কোনও জায়গায় আবার ব্যবহার করতে পারি যা বেশ কার্যকর হতে পারে।

উপরে তৈরি জেএসপিআইপি নমুনাগুলির একটিতে পিগব্যাকিং আমি এই পরীক্ষাটি এবং গতির সাথে তুলনা করার জন্য একটি প্রকরণ যুক্ত করেছি। 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());

আপনি যে যুক্তিগুলির সাথে মিল রাখতে চান তা আরম্ভ করার জন্য লুপের প্রথম বিভাগটি ব্যবহার করুন, দ্বিতীয় অংশটি লুপটি চলমান থেকে থামাতে এবং তৃতীয় বিভাগটি লুপটি অবশেষে প্রস্থান করতে বাধ্য করবে।

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