Time Sort
시간 오름차순 정렬
- 과거로부터 시간 오름차순으로 정렬할 수 있다.
new Date()
사용const schedules = [ { id : 1, schedule : '2021-03-13T11:00:00.000Z' }, { id : 2, schedule : '2019-01-13T05:00:00.000Z' }, { id : 3, schedule : '2022-04-22T00:00:00.000Z' }, { id : 4, schedule : '2011-04-16T12:00:00.000Z' } ]; schedules.sort((a,b)=> { a = new Date(a.schedule); b = new Date(b.schedule); return a - b; });
- 결과값
- 결과값
moment.js
사용const schedules = [ { id : 1, schedule : '2021-10-01T11:00:00.000Z' }, { id : 2, schedule : '2021-01-13T05:00:00.000Z' }, { id : 3, schedule : '2025-04-22T00:00:00.000Z' }, { id : 4, schedule : '2019-09-16T12:00:00.000Z' } ]; schedules.sort((a,b)=> { a = moment(a.schedule); b = moment(b.schedule); return a - b; });
- 결과값
- 결과값
오늘 날짜와 비교한 시간 정렬
- 오늘을 기준으로 날짜를 정렬해보려고 한다.
- 오늘 날짜를 기준으로 할 경우 아직 지나지 않은 날짜가 -(마이너스)로 표기된다는 점을 주의하자
- 조건
- 오늘 날짜 기준으로 아직 지나지 않은 날짜 중 가장 가까운 날짜를 더 먼 날짜보다 앞으로 뺀다
- 오늘 날짜 기준으로 이미 지난 날짜 중 가장 최근 날짜를 더 오래된 날짜보다 앞으로 뺀다.
new Date()
사용const today = new Date() const schedules = [ { id : 1, schedule : '2021-10-01T11:00:00.000Z' }, { id : 2, schedule : '2022-05-13T05:00:00.000Z' }, { id : 3, schedule : '2025-04-22T00:00:00.000Z' }, { id : 4, schedule : '2019-09-16T12:00:00.000Z' } ]; schedules.sort((a, b) => { a = new Date(a.schedule) b = new Date(b.schedule) a = Math.floor((today - a) / (1000 * 60 * 60 * 24)) b = Math.floor((today - b) / (1000 * 60 * 60 * 24)) if (a < 0) { // 기준값이 아직 지나지 않은 날짜이고, if (b < 0) { // 비교값도 아직 지나지 않은 날짜일 경우 내림차순으로 정렬 return b - a; } else { // 비교값이 지난 날짜일 경우에는 오름차순으로 정렬 return a - b; } } else { // 기준값과 비교값이 모두 지난 날짜일 경우에는 오름차순 정렬 return a - b; } return 0 })
- date 타입의 경우 -(마이너스) 연산자를 통해 숫자로 변환할 수 있다.
- 결과값
moment.js
사용const today = moment().format('YYYY-MM-DD HH:mm:ss'); const schedules = [ { id : 1, schedule : '2021-10-01T11:00:00.000Z' }, { id : 2, schedule : '2022-05-13T05:00:00.000Z' }, { id : 3, schedule : '2025-04-22T00:00:00.000Z' }, { id : 4, schedule : '2019-09-16T12:00:00.000Z' } ]; schedules.sort((a, b) => { a = moment(today).diff(a.schedule, 'days'); b = moment(today).diff(b.schedule, 'days'); const [startDateA, endDateA] = getDates(a); const [startDateB, endDateB] = getDates(b); if (endDateA > now && endDateB > now) { return endDateA.diff(endDateB, 'days'); } else if (endDateA < now && endDateB > now) { return 1; } else if (endDateA >= now && endDateB < now) { return -1; } else { return startDateB.diff(startDateA, 'days'); } }); if (a < 0) { // 기준값이 아직 지나지 않은 날짜이고, if (b < 0) { // 비교값도 아직 지나지 않은 날짜일 경우 내림차순으로 정렬 return b - a; } else { // 비교값이 지난 날짜일 경우에는 오름차순으로 정렬 return a - b; } } else { // 기준값과 비교값이 모두 지난 날짜일 경우에는 오름차순 정렬 return a - b; } return 0 })
moment(기준날짜).diff(비교날짜, 'days')
를 이용하여 날짜의 차이를 일단위로 구할 수 있다.- 결과값은
new Date()
를 사용했을때와 동일하다.
하위 배열에 속해있는 날짜값으로 상위 데이터를 정렬해보자.
- 실제 개발을 하다보면 데이터가 저렇게 깔끔하게 나오지 않고 날짜를 품고 있는 데이터를 다뤄줘야할 일이 발생할 수 있다.
- 위 날짜 정렬을 응용해서 하위로 속해있는 날짜 데이터 값으로 상위 데이터의 순서를 변경해보려고 한다.
- 조건
- 데이터 속 날짜 배열의 값을 비교하여 아직 지나지 않은 날짜의 데이터를 앞으로, 이미 지난 날짜의 데이터를 뒤로 보낸다.
- 아직 지나지 않은 날짜는 오늘 날짜와 가장 가까운 날짜를 데이터의 가장 앞으로 오게 한다.
- 이미 지난 날짜는 오늘 날짜와 가장 가까운 날짜를 이미 지난 날짜 중에서 가장 앞으로 오게 한다.
- 위 예시에서의 schedule 데이터가
Data
라는 배열 안에 각 요소로 들어가있다고 가정하자const Data = [ { id: 1, name: 'summer', schedule: [ { id : 1, schedule : '2022-01-01T20:00:00.000Z' }, { id : 2, schedule : '2022-01-21T20:00:00.000Z' }, { id : 3, schedule : '2022-02-11T20:00:00.000Z' }, { id : 4, schedule : '2022-03-03T20:00:00.000Z' } ] }, { id: 2, name: 'winter', schedule: [ { id : 1, schedule : '2022-03-01T13:00:00.000Z' }, { id : 2, schedule : '2022-03-08T13:00:00.000Z' }, { id : 3, schedule : '2022-03-15T13:00:00.000Z' }, { id : 4, schedule : '2022-03-22T13:00:00.000Z' } ] }, { id: 3, name: 'spring', schedule: [ { id : 1, schedule : '2022-03-30T19:00:00.000Z' }, { id : 2, schedule : '2022-04-30T19:00:00.000Z' }, { id : 3, schedule : '2022-05-30T19:00:00.000Z' }, { id : 4, schedule : '2022-06-30T19:00:00.000Z' } ] } ]
- 위 예시에서의 schedule 데이터가
- 참고:
moment.js
를 사용했다.let countDays; // 오늘을 기준으로 차이값을 담아줄 변수 const today = moment().format('YYYY-MM-DD HH:mm:ss'); const changeTimeToNumber = (date) => { // 일차를 숫자로 변환해주는 함수 for (let day of date.schedule) { // for 문으로 모든 schedule 값을 숫자로 변환 countDays = moment(today).diff(date.schedule, 'days'); if (countDays < 0) { break; } } return countDays; }; Date.sort((a, b) => { const a = changeTimeToNumber(a); const b = changeTimeToNumber(b); if (a < 0 && b < 0) return b - a; if (a > 0 && b > 0) return a - b; if (a > b) return b - a; if (a < b) return a - b; return 0; })
- 이렇게 해서 날짜가 원하는대로 잘 나오긴 한다.
- 혹시 내가 틀렸다면 이메일로 둥글게..🙏