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

JavaScript에서 값으로 객체의 키 가져오기 - 값으로 키 찾는 방법

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

이 방식은 중간 객체를 생성하지 않고 조건에 맞는 첫 번째 키-값 쌍을 바로 찾기 때문에, 한 번만 조회하는 경우에는 더 효율적입니다. 반면 같은 객체에서 여러 번 조회해야 한다면, 첫 번째 방법처럼 미리 역매핑 객체를 만들어 두는 것이 유리합니다.