एक नंबर को एक महीने के नाम में बदलने के लिए स्विच केस ब्लॉक को कैसे छोटा करें?


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
IMHO vidriduch का उत्तर सबसे उपयुक्त है। यह संभवतः आपके कोड का एकमात्र हिस्सा नहीं है, जिसके लिए दिनांक जोड़-तोड़ की आवश्यकता होती है (भले ही आपने जो दिखाया हो वह कण कोड के लिए आसान है)। आपको मौजूदा परीक्षण किए गए दिनांक पुस्तकालयों का उपयोग करने पर गंभीरता से विचार करना चाहिए।
coredump

2
मैं जावास्क्रिप्ट नहीं जानता, लेकिन क्या उसके पास हैशमैप नहीं है, जैसे कि पायथन डिक्शनरी या C ++ का std :: map?
मैन

28
क्या यह माना नहीं जाता है कि यह codereview.stackexchange.com के लिए है ?
लोको

2
इतने सारे उत्तर डिफ़ॉल्ट '' को ध्यान में न रखते हुए कोड के व्यवहार को बदलते हैं, जिसके परिणामस्वरूप अपरिभाषित आउटपुट होता है, जो कि मूल के रूप में भिन्न होता है।
पीटर बी

2
यह कोई डुप्लिकेट सवाल नहीं है: :( यह एक पूरी तरह से अलग सवाल पूछ रहा है, जवाब हालांकि एक ही हो सकता है।
लियोन गबन

जवाबों:


199

एक सरणी को परिभाषित करें, फिर इंडेक्स द्वारा प्राप्त करें।

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

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

23
इसके बजाय mm - 1आप undefinedपहले मूल्य (इंडेक्स 0) के रूप में भी सेट कर सकते हैं, इसलिए सरणी सूचकांकों की संख्या महीनों से मेल
खाएगी

9
var month = month[(mm -1) % 12]
mpez0

77
@ mpez0 मुझे लगता है कि मैं यह जानना पसंद करूंगा कि किसी को महीने की संख्या 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
प्रश्न में समस्या कथन को देखते हुए, आपका उत्तर वास्तव में उस समस्या को हल नहीं कर रहा है, लेकिन कुछ अलग समाधान जो एक अलग संदर्भ में सही हो सकते हैं। चयनित उत्तर अभी भी सबसे अच्छा और सबसे कुशल है।
TechMaze 5

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
"वर्ष के महीनों" की तुलना में बड़े डेटासेट पर यह संभवतः अधिक कुशल होगा।
DGM

3
यह प्रभावी रूप से एक एनम है (अर्थात इसे अपरिवर्तनीय बनाएं), इसे जावास्क्रिप्ट मेंvar months = Object.freeze({'1': 'January', '2': 'February'}); //etc सी एनम के
सिकंदर

1
@Alexander यदि आप कुंजी और मूल्यों को स्वैप करते हैं, तो हाँ यह एक एनम के समान है।
लेकिन मैं

26

आप इसके बजाय एक सरणी बना सकते हैं और महीने का नाम देख सकते हैं:

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


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

कोड के पीछे तर्कसंगत के लिए @CupawnTae द्वारा उत्तर देखें || ''


बल्कि 0 सूचकांक के साथ शुरू से आप रख सकता है undefinedपर 0 के रूप में var months = [ undefined, 'January','February','March', .....इस तरह से आप का उपयोग होगाmonth = months[mm];
Grijesh चौहान

@GrijeshChauhan: कृपया 'चतुर' कोड से बचें। अगले व्यक्ति की पहली प्रतिक्रिया wtf होगी। यह केवल एक '-1', महीने है। गति तब 13, wtf ^ 2 होगी। programmers.stackexchange.com/questions/91854/…
RvdK

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- इसके परिणामस्वरूप अमान्य महीनों के लिए फेंक दिया जाएगा और संभवतः कॉलिंग स्क्रिप्ट को पूरी तरह से मार देगा।

यदि आप करते हैं पता है पूरे संदर्भ - जैसे यह सब अपने खुद के कोड है, और कोई नहीं-कभी इसका इस्तेमाल करने के लिए जा रहा है, और तुम पर भरोसा है अपने आप को भूल नहीं यदि आप भविष्य में परिवर्तन कुछ समय बनाया - यह व्यवहार बदलने के लिए सुरक्षित हो सकता है इस तरह से, लेकिन कई कीड़े इस तरह की धारणा से आते हैं कि वास्तविक जीवन में आप रक्षात्मक रूप से प्रोग्रामिंग करने और / या व्यवहार को अच्छी तरह से दस्तावेज करने से बहुत बेहतर हैं।

वासमू का उत्तर सही हो जाता है (EDIT: कई अन्य उत्तर, जिनमें स्वीकृत एक भी शामिल है, अब भी तय हो गया है) - आप उपयोग कर सकते हैं 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
किसी और ने अभी तक व्यवहार में परिवर्तन का उल्लेख नहीं किया है, इसलिए इसे फिर से फैक्टरिंग कोड को ध्यान में रखा जाना चाहिए।
मौरो

यह उत्तर हाजिर है। अधिकांश अन्य उत्तर कोड के व्यवहार को सूक्ष्म तरीके से बदलते हैं। यह बात नहीं हो सकती है या यह बग को खोजने के लिए चिड़चिड़ा हो सकता है।
Pieter B

आह तो यह हमेशा एक संस्करण के लिए सबसे अच्छा है undefined? यदि प्रकार परिवर्तित हो जाता है तो क्या यह प्रदर्शन को बचाता है?
लियोन गैबन

2
@LeonGaban यह प्रदर्शन के बारे में नहीं है: मूल प्रश्न ने चर को एक रिक्त स्ट्रिंग पर आरंभीकृत किया और उस पर छोड़ दिया यदि कोई वैध महीना नहीं चुना गया था, जबकि यहाँ बहुत सारे अन्य उत्तरों ने उस तथ्य को अनदेखा कर दिया और 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 '';
}

एक बार फिर, एक लुक-अप टेबल या डेट फंक्शन का उपयोग करना अधिक रसीला और विषयगत रूप से बेहतर है


16

आप इसे एक सरणी का उपयोग करके कर सकते हैं:

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

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

12

यहां एक और विकल्प है जो केवल 1 चर का उपयोग करता है और अभी भी सीमा के बाहर ''होने पर डिफ़ॉल्ट मान लागू करता mmहै।

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

रेंज की जाँच, और एक अपवाद फेंकने से भी काम चल सकता है। और "त्रुटि", या "अपरिभाषित" वापस करना रिक्त स्ट्रिंग के लिए वैकल्पिक हो सकता है।
ChuckCottrill

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
मेरा मतलब यह है कि यह एक सुझाव है। संक्षिप्त रूप से रहते हुए यह वास्तव में बहुत पठनीय है, और विरल मैपिंग और गैर-संख्यात्मक कुंजियों के लिए अच्छी तरह से काम करेगा, जो सरणी समाधान नहीं करता है। PS मुझे मेरे जवाब पर एक यादृच्छिक अस्पष्टीकृत डाउनवोट भी मिला - शायद वही ड्राइव-बाय कलाकार।
क्यूपॉन्टे

6

कपवन ताए के उत्तर पर निर्माण पिछले मैंने इसे छोटा कर दिया है:

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] || '';
यिंगयांग

हालाँकि मैंने और ध्यान दिया है (जब मैंने पोस्ट किया तो आसपास नहीं था), var महीना = महीने [mm - 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

@Vidriduch की तरह, मैं आजकल के संदर्भ में कोड के i20y ("अंतर्राष्ट्रीयता") के महत्व को रेखांकित करना चाहता हूं और एकात्मक परीक्षण के साथ निम्नलिखित संक्षिप्त और मजबूत समाधान सुझाता हूं।

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

मैं जाऊंगा wasmoo के समाधान के, लेकिन इसे इस तरह समायोजित करें:

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

यह वास्तव में एक ही कोड है, लेकिन अलग-अलग इंडेंट है, जो IMO इसे अधिक पठनीय बनाता है।

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