JavaScript에서 숫자 배열과 목표 숫자를 인자로 받아, 배열 안에 있는 값 중 두 번째 인자로 전달된 숫자와 가장 가까운 값을 반환하는 함수를 작성해야 하는 경우가 종종 있습니다.
이 문제는 reduce() 메서드를 활용하면 간결하게 해결할 수 있습니다. 배열을 순회하면서 각 요소와 목표 숫자 사이의 절대적인 차이를 계산하고, 그 차이가 기존에 기록된 최소 차이보다 작으면 해당 값과 인덱스를 갱신하는 방식입니다.
예제 코드
아래 코드를 살펴보겠습니다.
const arr = [3, 56, 56, 23, 7, 76, -2, 345, 45, 76, 3];
const num = 37;
const findClosest = (arr, num) => {
const creds = arr.reduce((acc, val, ind) => {
let { diff, index } = acc;
const difference = Math.abs(val - num);
if (difference < diff) {
diff = difference;
index = ind;
}
return { diff, index };
}, {
diff: Infinity,
index: -1
});
return arr[creds.index];
};
console.log(findClosest(arr, num));코드 설명
- 초기 누적값으로
diff: Infinity와index: -1을 설정하여 어떤 차이든 항상 더 작도록 만듭니다. Math.abs(val - num)으로 각 요소와 목표 숫자 사이의 거리(절댓값)를 구합니다.- 현재 거리가 저장된 최소 거리보다 작으면
diff와index를 새로운 값으로 갱신합니다. - 순회가 끝나면 최종적으로 기록된 인덱스에 해당하는 배열 요소를 반환합니다.
출력 결과
콘솔에 출력되는 결과는 다음과 같습니다.
45
목표 숫자가 37일 때 배열에서 가장 가까운 값은 45이며, 이는 37과의 차이가 8로 다른 어떤 요소보다 작기 때문입니다.