কীভাবে সংখ্যাকে এক মাসের রূপে রূপান্তর করে সুইচ কেস ব্লককে সংক্ষিপ্ত করবেন?


110

এটি অল্প লাইনে লেখার কোনও উপায় কি তবে সহজেই পাঠযোগ্য?

var month = '';

switch(mm) {
    case '1':
        month = 'January';
        break;
    case '2':
        month = 'February';
        break;
    case '3':
        month = 'March';
        break;
    case '4':
        month = 'April';
        break;
    case '5':
        month = 'May';
        break;
    case '6':
        month = 'June';
        break;
    case '7':
        month = 'July';
        break;
    case '8':
        month = 'August';
        break;
    case '9':
        month = 'September';
        break;
    case '10':
        month = 'October';
        break;
    case '11':
        month = 'November';
        break;
    case '12':
        month = 'December';
        break;
}

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

2
আমি জাভাস্ক্রিপ্ট জানি না, তবে পাইথনের অভিধান বা সি ++ এর এসটিডি :: মানচিত্রের মতো এর কোনও হ্যাশম্যাপ নেই?
মাস্কেড ম্যান

28
এটি কি কোডেরভিউ.স্ট্যাকেক্সেঞ্জের.কমের জন্য বলে মনে হচ্ছে না ?
লোকো

2
তাই অনেক উত্তর উত্তরকে ডিফল্ট '' না নিয়েই কোডের আচরণ পরিবর্তন করে যা অনির্ধারিত আউটপুট দেয়, যা মূলটি কী করে তার চেয়ে আলাদা।
পিটার বি

2
এই না সদৃশ প্রশ্ন> :( এই একটি সম্পূর্ণ ভিন্ন প্রশ্ন জিজ্ঞাসা করা হয়, উত্তর কিন্তু একই হতে পারে।
লিওন Gaban

উত্তর:


199

একটি অ্যারে সংজ্ঞায়িত করুন, তারপরে সূচকের মাধ্যমে পান

var months = ['January', 'February', ...];

var month = months[mm - 1] || '';

23
পরিবর্তে mm - 1আপনি undefinedপ্রথম মান হিসাবেও সেট করতে পারেন (সূচক 0) যাতে অ্যারে সূচকগুলি মাসের সংখ্যার সাথে মেলে
টাফি

9
var month = month[(mm -1) % 12]
এমপিজেড

77
@ এমপিজ ০ আমি মনে করি যে, কেউ খারাপ ডেটা লুকিয়ে রাখার পরিবর্তে মাসের 15 নম্বর নিয়ে এসেছিল তা জানতে আমি পছন্দ করবো
ইজকাটা

21
@ টফি আমি মনে করি আমি সাথে থাকি mm-1, যাতে months.length==12
তিপিম্ম

48
@ টফি আমি যুক্তি দিয়ে বলব যে এটি স্বাদের বিষয় নয়, তবে চতুর কোড এড়ানোর বিষয়টি । নিজেকে অন্য কারও পড়ার কল্পনা করুন [undefined, 'January', 'February', ...]- আমি সেরা আপনার প্রথম প্রতিক্রিয়া ডাব্লুটিএফ ?! , যা সাধারণত একটি ভাল লক্ষণ নয় ...
चमत्कारিক প্রতিবেদন

81

অ্যারে মোটেও ব্যবহার না করা সম্পর্কে :)

var objDate = new Date("10/11/2009"),
    locale = "en-us",
    month = objDate.toLocaleString(locale, { month: "long" });

console.log(month);

// or if you want the shorter date: (also possible to use "narrow" for "O"
console.log(objDate.toLocaleString(locale, { month: "short" }));

এই উত্তর অনুসারে ডেভিড স্টোরীর তারিখ থেকে মাসের নাম পান


2
প্রশ্নে সমস্যার বিবৃতি দেওয়া, আপনার উত্তরটি আসলে সেই সমস্যাটির সমাধান করছে না তবে কিছু ভিন্ন সমাধান যা ভিন্ন প্রসঙ্গে সঠিক হতে পারে। নির্বাচিত উত্তর এখনও সেরা এবং সবচেয়ে কার্যকর।
টেকম্যাজে

6
কেবল new Date("2009-11-10")ফর্ম্যাটটি পার্স হওয়ার নিশ্চয়তা রয়েছে (এই সুনির্দিষ্টকরণটি দেখুন: ecma-international.org/publications/standards/Ecma-262.htm )। অন্যান্য তারিখের ফর্ম্যাটগুলি (আপনার উত্তরগুলির মধ্যে একটি সহ) পার্স করা যেতে পারে যদি ব্রাউজারটি এটি পছন্দ করে এবং তাই এটি পোর্টেবল হয় না।
জেবি।

58

এটা চেষ্টা কর:

var months = {'1': 'January', '2': 'February'}; //etc
var month = months[mm];

মনে রাখবেন যে mm কোনও পূর্ণসংখ্যা বা স্ট্রিং হতে পারে এবং এটি এখনও কাজ করবে।

আপনি যদি অ-বিদ্যমান কীগুলি খালি স্ট্রিংয়ের ''পরিবর্তে (পরিবর্তে undefined) করতে চান তবে এই লাইনটি যুক্ত করুন:

month = (month == undefined) ? '' : month;

জেএসফিডাল


4
"বছরের মাস" এর চেয়ে বড় ডেটাসেটগুলিতে এটি সম্ভবত আরও কার্যকর হবে।
ডিজিএম

3
এটি কার্যকরভাবে একটি এনাম (যেমন একে অপরিবর্তনীয় করে তোলা), এটি জাভাস্ক্রিপ্টে এনামvar months = Object.freeze({'1': 'January', '2': 'February'}); //etc দেখুন হিসাবে সংজ্ঞায়িত করুন ?
আলেকজান্ডার

1
@ আলেকজান্দার যদি আপনি কী এবং মানগুলি অদলবদল করেন তবে হ্যাঁ এটি এনামের মতো।
তবে আমি

26

আপনি পরিবর্তে একটি অ্যারে তৈরি করতে এবং মাসের নামটি দেখতে পারেন:

var months = ['January','February','March','April','May','June','July','August','September','October','November','December']


var month = months[mm-1] || '';

কোডের পিছনে যৌক্তিকতার জন্য @ কপোয়ানটাই দ্বারা উত্তর দেখুন || ''


বরং 0 সূচকের সাথে শুরু তুলনায় আপনি রাখতে পারে undefined0 হিসাবে var months = [ undefined, 'January','February','March', .....এই ভাবে আপনি ব্যবহার করতে পারে নাmonth = months[mm];
Grijesh চৌহান

@ গ্রিজেশচৌহান: দয়া করে 'চালাক' কোডটি এড়িয়ে চলুন। পরবর্তী ব্যক্তির প্রথম প্রতিক্রিয়া wtf হবে। এটি কেবল একটি '-1', মাস। দৈর্ঘ্য এর পরে 13, wtf ^ 2 হবে। প্রোগ্রামার্স.স্ট্যাকেক্সেঞ্জাওয়েজ / প্রশ্ন
৯১৫৫৪/২

19

সতর্ক হোন!

যে জিনিসটি সঙ্গে সঙ্গে অ্যালার্মের ঘণ্টা ট্রিগার করা উচিত তা হ'ল প্রথম লাইন: var month = '';- কেন এই পরিবর্তকটি খালি স্ট্রিংয়ের পরিবর্তে nullবা এর পরিবর্তে শুরু হচ্ছে undefined? এটি কেবল অভ্যাস বা অনুলিপি / কোড পেস্ট করা থাকতে পারে তবে আপনি যদি নিশ্চিত না জানেন যে আপনি যখন কোডটি রিফ্যাক্ট করছেন তখন এটিকে এড়িয়ে যাওয়া নিরাপদ নয়।

আপনি যদি মাসের নামের একটি অ্যারে ব্যবহার করেন এবং আপনার কোডটি var month = months[mm-1];আপনার কাছে পরিবর্তন করেন তবে আপনি আচরণটি পরিবর্তন করছেন, কারণ এখন সীমার বাইরে সংখ্যার জন্য বা অ-সংখ্যাগত মানগুলি monthহবে undefined। আপনি হয়ত জানেন যে এটি ঠিক আছে তবে অনেকগুলি পরিস্থিতি রয়েছে যেখানে এটি খারাপ হবে।

উদাহরণস্বরূপ, আসুন আমরা বলি switchযে আপনি কোনও ফাংশনে আছেন monthToName(mm)এবং কেউ আপনার ফাংশনটিকে এভাবে কল করছে:

var monthName = monthToName(mm);

if (monthName === '') {
  alert("Please enter a valid month.");
} else {
  submitMonth(monthName);
}

এখন আপনি যদি অ্যারে ব্যবহার করে ফিরে এসে পরিবর্তন করেন monthName[mm-1]তবে কলিং কোডটি ইচ্ছাকৃতভাবে আর কাজ করবে না এবং এটি undefinedযখন কোনও সতর্কতা প্রদর্শনের কথা বলে মনে হয় তখন মানগুলি জমা দেবে । আমি বলছি না এটি একটি ভাল কোড, তবে আপনি কীভাবে কোডটি ব্যবহার করা হচ্ছে ঠিক তা না জানলে আপনি অনুমান করতে পারবেন না।

অথবা সম্ভবত মূল সূচনাটি সেখানে ছিল কারণ লাইনটির আরও কিছু কোড ধরে নেওয়া হয় যে monthসর্বদা একটি স্ট্রিং হবে এবং এর মতো কিছু করেmonth.length - এর ফলে ব্যতিক্রমী মাসগুলিতে ছুঁড়ে ফেলা হবে এবং কলিং স্ক্রিপ্টটি সম্পূর্ণভাবে মেরে ফেলবে।

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

ওয়াসমুর উত্তরটি সঠিক হয়ে গেছে (সম্পাদনা: গৃহীত উত্তর সহ আরও কয়েকটি উত্তর এখন ঠিক করা হয়েছে) - আপনি কী ব্যবহার করছেন months[mm-1] || ''বা যদি আপনি এটি এক নজরে আরও স্পষ্ট করে তুলতে চান তবে এরকম কিছু:

var months = ['January', 'February', ...];

var month;

if (mm >= 1 && m <= 12) {
  month = months[mm - 1];
} else {
  month = ''; // empty string when not a valid month
}

1
আচরণের পরিবর্তনের কথা অন্য কেউ এখনও উল্লেখ করেনি, তাই কোডটি পুনরায় ফ্যাক্টরিং করার সময় এটিকে বিবেচনা করা উচিত।
মাউরো

এই উত্তর স্পট হয়। অন্যান্য উত্তরগুলির বেশিরভাগই সূক্ষ্ম উপায়ে কোডের আচরণ পরিবর্তন করে। এটি কোনও বিষয় নয় বা ত্রুটিযুক্তভাবে বাগ খুঁজে পাওয়া শক্ত হয়ে উঠতে পারে।
পিটার বি

আহ তাই সবসময় ভাল একটি var শুরু করা ভাল undefined? এই ধরণের রূপান্তরিত হয়ে যদি পারফরম্যান্সটি সংরক্ষণ করে?
লিওন গাবান

2
@ লিওনগাবান এটি কর্মক্ষমতা সম্পর্কে নয়: মূল প্রশ্নটি ভেরিয়েবলটিকে একটি খালি স্ট্রিংয়ে শুরু করে এবং যদি কোনও বৈধ মাস নির্বাচন না করা হয় তবে এখান থেকে ছেড়ে যায়, অন্যদিকে এখানে আরও অনেক উত্তর সেই সত্যটিকে উপেক্ষা করে এবং undefinedইনপুটটি ব্যর্থ হলে ফিরে আসার সাথে আচরণ পরিবর্তন করেছিল 'টি 1..12। ছাড়া খুব ব্যতিক্রমী পরিস্থিতি, সঠিক আচরণ তাস দেখান প্রত্যেক সময় কর্মক্ষমতা।
কাপউনটাএ

17

সম্পূর্ণতার জন্য আমি বর্তমানের উত্তরগুলিতে পরিপূরক চাই। মূলত, আপনি বাদ দিতে পারেনbreak কীওয়ার্ডটি এবং সরাসরি একটি উপযুক্ত মান প্রদান করতে পারেন। এই কৌশলটি কার্যকর যদি মানটি প্রাক্পম্পিউটেড লুক-আপ টেবিলে সংরক্ষণ না করা যায়।

function foo(mm) {
    switch(mm) {
        case '1':  return 'January';
        case '2':  return 'February';
        case '3':  return 'March';
        case '4':  return 'April';
        // [...]
        case '12': return 'December';
    }
    return '';
}

আবার, চেহারা-সারণী বা তারিখ ফাংশনগুলি ব্যবহার করা আরও সংক্ষিপ্ত এবং বিষয়গতভাবে আরও ভাল



12

এখানে আরও একটি বিকল্প রয়েছে যা কেবলমাত্র 1 টি ভেরিয়েবল ব্যবহার করে এবং এখনও সীমার বাইরে থাকা ''অবস্থায় ডিফল্ট মান প্রয়োগ করে mm

var month = ['January', 'February', 'March',
             'April', 'May', 'June', 'July',
             'August', 'September', 'October',
             'November', 'December'
            ][mm-1] || '';

ব্যাপ্তি পরীক্ষা করা, এবং একটি ব্যতিক্রম ছোঁড়াও কাজ করতে পারে। এবং "ত্রুটি", বা "অপরিজ্ঞাত" ফিরিয়ে দেওয়া খালি স্ট্রিংয়ের বিকল্প হতে পারে।
চককট্রিল

9

আপনি এটি শর্তাধীন অপারেটরগুলি ব্যবহার করে একটি স্যুইচের পরিবর্তে অভিব্যক্তি হিসাবে লিখতে পারেন:

var month =
  mm == 1 ? 'January' :
  mm == 2 ? 'February' :
  mm == 3 ? 'March' :
  mm == 4 ? 'April' :
  mm == 5 ? 'May' :
  mm == 6 ? 'June' :
  mm == 7 ? 'July' :
  mm == 8 ? 'August' :
  mm == 9 ? 'September' :
  mm == 10 ? 'October' :
  mm == 11 ? 'November' :
  mm == 12 ? 'December' :
  '';

যদি আপনি শৃঙ্খলাবদ্ধ শর্তাধীন অপারেটরগুলি আগে না দেখে থাকেন তবে প্রথমে এটি পড়া খুব কঠিন মনে হতে পারে। এটিকে একটি এক্সপ্রেশন হিসাবে লেখা মূল দিকের চেয়ে একটি দিক দেখতে আরও সহজ করে তোলে; এটা পরিষ্কার যে কোডের উদ্দেশ্যটি হল ভেরিয়েবলের জন্য একটি মান নির্ধারণ করা month


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

6

উপর নির্মাণের Cupawn কুন এর উত্তর পূর্ববর্তী আমি এটা কমান চাই:

var months = ['January', 'February', ...];
var month = (mm >= 1 && mm <= 12) ? months[mm - 1] : '';

বিকল্পভাবে, হ্যাঁ, আমি প্রশংসা করি, কম পাঠযোগ্য:

var month = months[mm - 1] || ''; // as mentioned further up

আপনি এড়িয়ে যেতে পারেন (!!months[mm - 1])এবং সহজভাবে করতে পারেন months[mm - 1]
ইয়ংইয়াং

অ্যারে সূচকটি সীমার বাইরে থাকলে এটি অপরিজ্ঞাত হয়ে যায়!
নিলিলিয়ট-এনএসডিভ

months[mm - 1]undefinedসীমার বাইরে থাকা সূচকের জন্য ফিরে আসবে । যেহেতু undefinedমিথ্যা তাই আপনার ''মানটি শেষ হবে month
ইয়িংইয়াং

অন্যান্য var month = months[mm - 1] || '';
উত্তরে

যদিও আমি আরও লক্ষ্য করেছি (পোস্ট করার সময় তার আশেপাশে ছিল না), তবে মাস = মাস [মিমি - 1] || ''; যা আরও শুদ্ধ হবে।
নিলিলিয়ট-এনএসডিভ

4
var getMonth=function(month){
   //Return string to number.
    var strMonth = ['January', 'February', 'March',
             'April', 'May', 'June', 'July',
             'August', 'September', 'October',
             'November', 'December'
            ];
    //return number to string.
    var intMonth={'January':1, 'February':2, 'March':3,
             'April':4, 'May':5, 'June':6, 'July':7,
             'August':8, 'September':9, 'October':10,
             'November':11, 'December':12
            };
    //Check type and return 
    return (typeof month === "number")?strMonth[month-1]:intMonth[month]
}

4

@ বিদ্রিদুচের মতো আমিও আজকালকার প্রসঙ্গে আই ২০ ওয়ানের ("আন্তর্জাতিকীকরণযোগ্যতা") এর গুরুত্বকে আন্ডারলাইজ করতে চাই এবং ইউনিটরি টেস্টের সাথে নিম্নলিখিত সংক্ষিপ্ত এবং দৃ solution় সমাধানের পরামর্শ দিতে চাই।

function num2month(month, locale) {
    if (month != Math.floor(month) || month < 1 || month > 12)
        return undefined;
    var objDate = new Date(Math.floor(month) + "/1/1970");
    return objDate.toLocaleString(locale, {month: "long"});
}

/* Test/demo */
for (mm = 1; mm <= 12; mm++)
    document.writeln(num2month(mm, "en") + " " +
                     num2month(mm, "ar-lb") + "<br/>");
document.writeln(num2month("x", "en") + "<br/>");
document.writeln(num2month(.1, "en") + "<br/>");
document.writeln(num2month(12.5, "en" + "<br/>"));

আমি মূল প্রশ্নের সাথে যতটা সম্ভব বন্ধ থাকার চেষ্টা করি, অর্থাত্ 1 টি থেকে 12 মাসের নামগুলিতে রূপান্তর করুন, কেবল একটি বিশেষ মামলার জন্য নয়, তবে undefinedঅবৈধ যুক্তিগুলির ক্ষেত্রে ফিরে আসুন, কিছু যুক্তিযুক্ত সমালোচনা এবং অন্যান্য বিষয়বস্তু ব্যবহার করে উত্তর। (থেকে পরিবর্তন undefinedকরতে '', তুচ্ছ হয় ক্ষেত্রে সঠিক ম্যাচিং প্রয়োজন হয়।)


0

আমি ওয়াসমুর সমাধানের জন্য যেতে চাই , তবে এটি এইভাবে ঠিক করুন:

var month = [
    'January',
    'February',
    'March',
    'April',
    'May',
    'June',
    'July',
    'August',
    'September',
    'October',
    'November',
    'December'
][mm-1] || '';

এটি হুবহু একই কোড, সত্যই, তবে আলাদাভাবে ইন্টেন্টেড, যা আইএমও এটিকে আরও পঠনযোগ্য করে তোলে।

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