Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

다른 배열을 기준으로 JavaScript 배열에서 월 범위 가져오는 방법

문자열로 이루어진 두 개의 배열이 있다고 가정해 보겠습니다. 첫 번째 배열에는 한 해의 각 월을 나타내는 문자열이 정확히 12개 들어 있습니다.

const year = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];

두 번째 배열에는 문자열 두 개만 들어 있으며, 찾고자 하는 월의 범위를 나타냅니다.

const monthsRange = ['aug', 'oct'];

이제 이 두 배열을 인수로 받아, 첫 번째 배열에서 두 번째 배열이 지정한 범위에 해당하는 모든 월을 골라내는 자바스크립트 함수를 작성해야 합니다.

위 예제 배열을 기준으로 하면 최종 출력은 다음과 같습니다.

const output = ['aug', 'sep'];

결과를 보면 범위의 마지막 월('oct')은 출력에서 제외됩니다. 즉, 시작 월은 포함하고 끝 월은 제외하는 것이 이 함수의 의도된 동작입니다.

구현 예제

const year = ['jan', 'feb', 'mar', 'apr', 'may', 'jun', 'jul', 'aug', 'sep', 'oct', 'nov', 'dec'];
const range = ['aug', 'dec'];

const getMonthsInRange = (year, range) => {
   const start = year.indexOf(range[0]);
   const end = year.indexOf(range[1] || range[0]);
   // 범위가 연말을 넘어 뒤집혀 있어도 정상 동작합니다
   if (start <= end) {
      return year.slice(start, end);
   } else {
      return year.slice(start).concat(year.slice(0, end));
   }
};

console.log(getMonthsInRange(year, range));

코드 동작 원리

먼저 indexOf() 메서드로 시작 월('aug')과 끝 월('dec')이 첫 번째 배열에서 몇 번째 인덱스에 위치하는지 찾아냅니다. 만약 끝 월이 전달되지 않으면 range[1] || range[0] 덕분에 시작 월과 동일한 값이 대신 사용됩니다.

다음으로 slice(start, end)는 시작 인덱스부터 끝 인덱스 바로 앞까지만 잘라서 반환하기 때문에, 끝 월인 'dec'는 자연스럽게 결과에서 빠지게 됩니다.

연말을 넘기는 범위도 처리 가능

범위가 ['nov', 'feb']처럼 연말을 넘어가는 경우에는 시작 인덱스가 끝 인덱스보다 커집니다. 이때는 year.slice(start)로 연말까지의 월들을 먼저 가져오고, 여기에 year.slice(0, end)로 연초부터 끝 월 직전까지의 월들을 concat()으로 이어 붙여 순환(circular) 범위를 올바르게 계산합니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[ 'aug', 'sep', 'oct', 'nov' ]