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

JavaScript에서 날짜 문자열 배열의 최소·최대 날짜 구하는 방법

문자열 형태의 날짜 데이터를 다루다 보면, 배열 안에서 가장 오래된 날짜(최솟값)가장 최신 날짜(최댓값)를 찾아야 하는 경우가 자주 발생합니다.

예를 들어 다음과 같이 날짜 문자열로 이루어진 배열이 있다고 가정해 보겠습니다.

const arr = [
  "2017-01-22 00:21:17.0",
  "2017-01-27 11:30:23.0",
  "2017-01-24 15:53:21.0",
  "2017-01-27 11:34:18.0",
  "2017-01-26 16:55:48.0",
  "2017-01-22 11:57:12.0",
  "2017-01-27 11:35:43.0"
];

문제 정의

위와 같은 배열을 입력으로 받는 JavaScript 함수를 작성해야 합니다. 함수는 배열 전체를 살펴보아 가장 오래된 날짜와 가장 최신 날짜를 각각 찾은 뒤, 두 날짜를 담고 있는 객체를 반환해야 합니다.

해결 방법

핵심 아이디어는 reduce() 메서드를 활용하는 것입니다. 배열을 순회하면서 각 요소를 누산기(acc)에 저장된 최솟값·최댓값과 비교하고, 조건에 맞으면 값을 갱신하는 방식입니다.

여기서 주목할 점은 이 예제의 날짜 문자열이 "YYYY-MM-DD HH:mm:ss.s"처럼 ISO 8601 형식을 따른다는 것입니다. 이러한 형식의 문자열은 사전순(lexicographic) 비교만으로도 시간순 비교와 동일한 결과를 얻을 수 있으므로, 별도로 Date 객체로 변환하지 않고도 단순 비교 연산자(<, >)만으로 처리할 수 있습니다.

예제 코드

const arr = [
  "2017-01-22 00:21:17.0",
  "2017-01-27 11:30:23.0",
  "2017-01-24 15:53:21.0",
  "2017-01-27 11:34:18.0",
  "2017-01-26 16:55:48.0",
  "2017-01-22 11:57:12.0",
  "2017-01-27 11:35:43.0"
];

const findMinMaxDate = (arr = []) => {
  const res = arr.reduce((acc, val, ind) => {
    if (!ind) {
      return { min: val, max: val };
    }
    if (val < acc.min) {
      acc.min = val;
    }
    if (val > acc.max) {
      acc.max = val;
    }
    return acc;
  }, undefined);
  return res;
};

console.log(findMinMaxDate(arr));

동작 원리

  • 첫 번째 요소(ind === 0): 아직 비교 대상이 없으므로 min과 max를 모두 해당 값으로 초기화합니다.
  • 이후 요소: 현재 값(val)이 저장된 최솟값보다 작으면 min을 갱신하고, 최댓값보다 크면 max를 갱신합니다.
  • 반환값: 모든 순회가 끝나면 최종적으로 { min, max } 객체를 반환합니다.

출력 결과

코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.

{ min: '2017-01-22 00:21:17.0', max: '2017-01-27 11:35:43.0' }

즉, 이 배열에서 가장 오래된 날짜는 '2017-01-22 00:21:17.0'이며, 가장 최신 날짜는 '2017-01-27 11:35:43.0'입니다.