JavaScript에서 객체의 값(value)을 알고 있을 때, 그 값에 해당하는 키(key)를 찾아야 하는 경우가 종종 있습니다. 일반적으로 우리는 키로 값을 조회하지만, 이번 글에서는 그 반대 작업을 수행하는 방법을 살펴보겠습니다.
다음과 같은 객체가 있다고 가정해 보겠습니다.
const products = {
"Pineapple": 38,
"Apple": 110,
"Pear": 109
};이 객체의 모든 키는 서로 고유하며, 모든 값 역시 서로 고유합니다. 여기서 우리는 값을 인자로 받아 해당 값의 키를 반환하는 함수를 작성해야 합니다.
예를 들어, findKey(110)을 호출하면 다음과 같은 결과가 반환되어야 합니다.
"Apple"
해결 접근 방식
이 문제는 역매핑(reverse mapping) 기법으로 해결할 수 있습니다. 먼저 객체의 값을 키로, 키를 값으로 뒤집은 새로운 객체를 만든 다음, 일반적인 객체 표기법을 사용해 원하는 키를 간단히 조회하는 것입니다.
예제 코드
다음은 전체 구현 코드입니다.
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));코드 설명
Object.keys(obj)로 객체의 모든 키를 배열로 가져옵니다.- 각 키에 대해
res[obj[key]] = key;를 실행하여 값과 키의 위치를 뒤집은 새로운 객체res를 만듭니다. - 마지막으로
res[val]을 조회하고, 값이 존재하지 않으면false를 반환하도록 처리했습니다.
출력 결과
위 코드를 실행하면 콘솔에 다음과 같이 출력됩니다.
Apple
대안: Object.entries 활용하기
ES2017부터 사용 가능한 Object.entries() 메서드를 사용하면 더욱 간결하게 작성할 수도 있습니다.
const findKey = (obj, val) =>
Object.entries(obj).find(([key, value]) => value === val)?.[0] || false;
console.log(findKey(products, 110)); // "Apple"
console.log(findKey(products, 999)); // false이 방식은 중간 객체를 생성하지 않고 조건에 맞는 첫 번째 키-값 쌍을 바로 찾기 때문에, 한 번만 조회하는 경우에는 더 효율적입니다. 반면 같은 객체에서 여러 번 조회해야 한다면, 첫 번째 방법처럼 미리 역매핑 객체를 만들어 두는 것이 유리합니다.