안녕하세요:) 개발자 우디입니다! 아래 내용 관련하여 작업 중이신 분들께 도움이되길 바라며 글을 공유하니 참고 부탁드립니다😊
(이번에 벨로그로 이사오면서 예전 글을 옮겨적었습니다. 이 점 양해 부탁드립니다!)
작업 시점: 2022년 9월
배경
- 특정 배열을 데이터로 그려진 그래프에서 유의미한 지점을 5개 뽑아내야 하는 상황임.
- 그냥 수치 높은 부분 5개로 할 경우 한 쪽에 몰려서 추출되는 현상 발생 → 피크(peak) 값을 추출할 경우에는 다양한 구간이 추출되고, 피크 자체로도 유의미한 것으로 관찰되어서 이 방식으로 진행.
배열에서 피크 값 추출하기
const getPeakFromArr = arr => {
let peakObj = [];
if (arr.length > 2) {
let pos = -1;
for (let idx in arr) {
if (arr[idx] > arr[idx - 1]) {
pos = idx;
} else if (arr[idx] < arr[idx - 1] && pos !== -1) {
peakObj.push({ idx: pos, val: arr[pos] });
pos = -1;
}
}
}
return peakObj;
};
- getPeakFromArr 함수 정의
- 3개 요소일 경우부터 피크 값이 의미있을 것이기 때문에, 3개 이상인 경우만 고려함.
- 피크인 지점의 핵심은 이전 값 보다 현재의 값이 증가하고, 현재의 값보다 다음 값이 감소하는 형태가 되어야 한다는 것임.
- 인자로 받은 배열을 반복문 돌면서 인덱스로 작업 진행.
- 현재 인덱스에서의 배열 값이 이전 인덱스에서의 배열 값보다
- 클 경우(증가한 경우)
- pos 값을 현재 idx로 변경 후 다음 idx로 넘어감
- 작을 경우 (감소한 경우)
- pos가 -1인 경우
- 증가한 경우에는 무조건 pos 값이 변경되어야 하기 때문에, 이 경우에는 증가하지 않은 것임 → 증가한 적이 없으므로 피크 값에 해당하지 않음 → 그냥 다음 idx로 넘어감.
- pos가 -1이 아닌 경우
- pos가 변경됐다는 건 증가했었다가 감소했다는 의미이므로 피크 값으로 추가.
- 추가 완료 후 pos를 다시 -1로 초기화.