[javascript] 숫자를 월 이름으로 변환하는 스위치 케이스 블록을 단축하는 방법은 무엇입니까?

적은 수의 줄로 작성하는 방법이 있지만 여전히 쉽게 읽을 수 있습니까?

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



답변

배열을 정의한 다음 인덱스로 가져옵니다.

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

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


답변

배열을 전혀 사용하지 않는 것은 어떻습니까? 🙂

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" }));

이 답변에 따라 David Storey 에서 날짜 에서 월 이름 가져 오기


답변

이 시도:

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

참고 mm 정수 또는 문자열이 될 수 있으며, 그것은 여전히 작동합니다.

존재하지 않는 키가 빈 문자열 ''(대신 undefined)이되도록하려면 다음 줄을 추가합니다.

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

JSFiddle .


답변

대신 배열을 만들고 월 이름을 조회 할 수 있습니다.

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


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

코드이면의 합리적인 이유는 @CupawnTae의 답변을 참조하십시오. || ''


답변

조심해!

즉시 알람 벨을 트리거해야하는 것은 첫 번째 줄입니다 var month = '';.-이 변수가 null또는 대신 빈 문자열로 초기화되는 이유undefined 무엇입니까? 그것은 단지 습관이거나 복사 / 붙여 넣기 된 코드 일 수 있지만, 확실히 알지 못한다면 코드를 리팩토링 할 때 무시하는 것이 안전하지 않습니다.

월 이름 배열을 사용하고 코드를 var month = months[mm-1];변경하면 이제 범위를 벗어난 숫자 또는 숫자가 아닌 값 monthundefined . 이것이 괜찮다는 것을 알 수 있지만 이것이 나쁜 상황이 많이 있습니다.

예를 들어, 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 이 경우 잘못된 달 동안 예외가 발생하고 잠재적으로 호출 스크립트를 완전히 종료 할 수 있습니다.

당신이 경우 어떻게 알고 전체 컨텍스트 – 예를 들어, 그것을 모두 자신의 코드, 그리고 다른 아무도 이제까지 그것을 사용하려고하지 않습니다, 그리고 당신은 자신 당신이 미래에 변경 언젠가했다 잊지 신뢰 -이 동작을 변경하는 것이 안전 할 수있다 하지만 실제 생활에서 방어 적으로 프로그래밍하거나 동작을 철저히 문서화하는 것이 훨씬 낫다는 가정에서 많은 버그가 발생합니다.

Wasmoo의 대답 이 옳습니다 (편집 : 수락 된 답변을 포함한 다른 여러 답변도 수정되었습니다)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
}


답변

완전성을 위해 현재 답변을 보완하고 싶습니다. 기본적으로 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 '';
}

다시 한 번, 조회 테이블 또는 날짜 함수를 사용하는 것이 더 간결하고 주관적으로 더 좋습니다 .


답변

배열을 사용하여 할 수 있습니다.

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

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