Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript에서 객체 역 매핑하기: 값으로 키를 찾는 방법

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()를 사용해 직접 검색하는 방법도 고려해 볼 수 있습니다.