JavaScript에서 객체의 키(key)가 아닌 값(value)을 이용해 해당 키를 찾아야 하는 경우가 종종 있습니다. 이런 기법을 역 매핑(reverse mapping)이라고 부르며, 객체의 구조를 뒤집어 값과 키의 관계를 반전시키는 방식으로 구현할 수 있습니다.
문제 상황
다음과 같은 객체가 있다고 가정해 보겠습니다.
const products = {
"Pineapple": 38,
"Apple": 110,
"Pear": 109
};이 객체에서 모든 키는 서로 고유하고, 모든 값 역시 서로 고유합니다.
여기서 우리가 만들어야 할 함수는 하나의 값을 전달받아 그 값에 해당하는 키를 반환하는 함수입니다. 예를 들어 findKey()라는 함수를 만들었다고 하면, 다음과 같이 동작해야 합니다.
findKey(110) // 결과: "Apple"
해결 접근 방식
이 문제는 두 단계로 나누어 해결할 수 있습니다.
1단계: 먼저 원본 객체의 값을 키로, 키를 값으로 하는 새로운 역 매핑 객체를 생성합니다.
2단계: 역 매핑된 객체에서 일반적인 객체 표기법(obj[key])을 사용해 원하는 키를 손쉽게 조회합니다.
값이 존재하지 않는 경우에는 false를 반환하여 안전하게 처리하도록 합니다.
구현 코드
위 접근 방식을 코드로 작성하면 다음과 같습니다.
const products = {
"Pineapple": 38,
"Apple": 110,
"Pear": 109
};
const findKey = (obj, val) => {
const res = {};
// 객체의 각 키를 순회하며 값-키 관계를 반전시킴
Object.keys(obj).map(key => {
res[obj[key]] = key;
});
// 값이 객체에 존재하지 않으면 false 반환
return res[val] || false;
};
console.log(findKey(products, 110));실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
Apple
추가 팁: Object.entries() 활용하기
모던 JavaScript에서는 Object.entries()를 사용하면 코드를 더욱 간결하게 작성할 수 있습니다.
const findKey = (obj, val) => {
const res = Object.fromEntries(
Object.entries(obj).map(([key, value]) => [value, key])
);
return res[val] || false;
};또한 성능이 중요한 대용량 객체를 다룰 때는 매번 역 매핑 객체를 생성하는 대신, 한 번 생성한 후 재사용하거나 Object.keys().find()를 사용해 직접 검색하는 방법도 고려해 볼 수 있습니다.