다음과 같은 숫자 배열이 있다고 가정해 보겠습니다.
const arr = [3, 5, 7, 8, 3, 5, 7, 4, 2, 8, 4, 2, 1];
여기서 우리는 각 요소와 바로 앞에 있는 요소(선행 요소)의 평균을 담은 새로운 배열을 반환하는 함수를 작성해야 합니다. 단, 첫 번째 요소는 앞에 다른 요소가 존재하지 않기 때문에 해당 요소 자체를 그대로 반환하면 됩니다.
이 문제는 Array.prototype.map() 메서드를 활용하면 간결하게 해결할 수 있습니다. 코드를 작성해 보겠습니다.
예제
const consecutiveAverage = arr => {
return arr.map((el, ind, array) => {
return ((el + (array[ind-1] || 0)) / (1 + !!ind));
});
};
console.log(consecutiveAverage(arr));코드 동작 원리
위 코드의 핵심 로직은 다음 두 부분으로 나눌 수 있습니다.
array[ind-1] || 0: 현재 요소의 이전 값을 가져옵니다. 첫 번째 요소의 경우 인덱스가 0이므로array[-1]은undefined가 되고, OR 연산자(||)에 의해 0으로 대체됩니다.1 + !!ind: 나눗셈의 분모 역할을 합니다. 인덱스가 0이면!!ind는false(즉, 0)가 되어 분모가 1이 되고, 그 외의 경우에는true(즉, 1)가 되어 분모가 2가 됩니다. 덕분에 첫 번째 요소는 자기 자신만으로, 나머지 요소는 이전 요소와 함께 평균이 계산됩니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
[
3, 4, 6, 7.5, 5.5, 4,
6, 5.5, 3, 5, 6, 3,
1.5
]
결과를 살펴보면 첫 번째 값은 3(첫 요소 그대로), 두 번째 값은 (5+3)/2 = 4, 세 번째 값은 (7+5)/2 = 6처럼 각 요소와 이전 요소의 평균이 순서대로 계산된 것을 확인할 수 있습니다.