숫자들의 집합이 주어졌을 때, 함수의 입력값으로 전달된 특정 숫자와 같거나 그보다 큰 수 중 가장 가까운 값을 가진 키(key)를 찾아야 하는 경우가 있습니다.
예를 들어, 다음과 같은 숫자 집합이 정의되어 있다고 가정해 보겠습니다.
const numbers = {
A:107,
B:112,
C:117,
D:127,
E:132,
F:140,
G:117,
H:127,
I:132,
J:132,
K:140,
L:147,
M:117,
N:127,
O:132
};해결 접근 방식
이 문제는 reduce() 메서드를 활용하면 간결하게 해결할 수 있습니다. 핵심 로직은 다음과 같습니다.
- 객체의 모든 키를 순회하면서 각 값과 입력값의 차이(difference)를 계산합니다.
- 차이가 0 이상(즉, 입력값보다 크거나 같은 수)이면서 기존에 저장된 최소 차이보다 작은 경우, 해당 키를 결과로 저장합니다.
- 초기 diff 값은 Infinity로 설정하여 어떤 유효한 차이보다도 크게 만듭니다.
이렇게 하면 조건을 만족하는 여러 키 중에서 입력값과의 차이가 가장 작은, 즉 '가장 가까운 큰 숫자'에 해당하는 키만 남게 됩니다.
예제 코드
전체 구현 코드는 다음과 같습니다.
const numbers = {
A:107,
B:112,
C:117,
D:127,
E:132,
F:140,
G:117,
H:127,
I:132,
J:132,
K:140,
L:147,
M:117,
N:127,
O:132
};
const nearestHighest = (obj, val) => {
let diff = Infinity;
const nearest = Object.keys(obj).reduce((acc, key) => {
let difference = obj[key] - val;
if (difference >= 0 && difference < diff) {
diff = difference;
acc = [key];
}
return acc;
}, [])
return nearest;
};
console.log(nearestHighest(numbers, 140));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 결과가 출력됩니다.
['F']
입력값이 140일 때, 객체에서 140과 같거나 그보다 큰 값들은 F(140), K(140), L(147)입니다. 이 중 가장 가까운 값은 140이며, reduce가 앞선 키부터 순회하므로 처음 발견된 'F'가 최종 결과로 반환됩니다.
참고 사항
동일한 값을 가진 키가 여러 개 존재할 경우(F와 K처럼), 이 코드는 먼저 등장한 키 하나만 반환합니다. 만약 조건을 만족하는 모든 키를 얻고 싶다면, acc 배열에 push하는 방식으로 코드를 수정하면 됩니다. 또한 배열 형태의 데이터라면 Object.keys 대신 배열 메서드를 직접 사용해도 같은 로직을 적용할 수 있습니다.