[javascript] JavaScript 객체에서 키를 값으로 얻는 방법은 무엇입니까?

매우 간단한 JavaScript 객체가 있는데 연관 배열로 사용합니다. 값의 키를 얻을 수있는 간단한 기능이 있습니까? 아니면 객체를 반복하고 수동으로 찾아야합니까?



답변

Underscore.js 라이브러리를 사용하여 :

var hash = {
  foo: 1,
  bar: 2
};

(_.invert(hash))[1]; // => 'foo'


답변

function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}

ES6, 프로토 타입 돌연변이 또는 외부 라이브러리 없음.

예,

function getKeyByValue(object, value) {
  return Object.keys(object).find(key => object[key] === value);
}


const map = {"first" : "1", "second" : "2"};
console.log(getKeyByValue(map,"2"));


답변

사용 가능한 표준 방법이 없습니다. 반복해야하며 간단한 도우미를 만들 수 있습니다.

Object.prototype.getKeyByValue = function( value ) {
    for( var prop in this ) {
        if( this.hasOwnProperty( prop ) ) {
             if( this[ prop ] === value )
                 return prop;
        }
    }
}

var test = {
   key1: 42,
   key2: 'foo'
};

test.getKeyByValue( 42 );  // returns 'key1'

주의 사항 : 위의 방법으로 작동하더라도 일반적으로 호스트 또는 기본 객체를 확장하는 것은 좋지 않습니다 .prototype. 문제에 잘 맞기 때문에 여기에서했습니다. 어쨌든, 아마도이 함수를 외부에서 사용해야 .prototype하고 대신 객체를 전달해야합니다.


답변

언급했듯이 반복이 필요합니다. 예를 들어 최신 브라우저에서는 다음을 수행 할 수 있습니다.

var key = Object.keys(obj).filter(function(key) {return obj[key] === value})[0];

어디 value찾고자하는 가치가있는 . 나는 아마도 루프를 사용할 것이라고 말했다.

그렇지 않으면 적절한 “hashmap”객체를 사용할 수 있습니다. JS에는 여러 가지 구현이 있거나 직접 구현할 수 있습니다.

2018 업데이트

6 년이 지났지 만 여전히 투표권을 얻었으므로 현대 브라우저 / 환경을위한보다 현대적인 솔루션처럼 의견 자체가 아니라 답변 자체에서 언급해야합니다.

const key = Object.keys(obj).find(key => obj[key] === value);

물론 그것은 또한 함수가 될 수 있습니다 :

const getKeyByValue = (obj, value) =>
        Object.keys(obj).find(key => obj[key] === value);


답변

lodash 방식 https://lodash.com/docs#findKey

var users = {
  'barney':  { 'age': 36, 'active': true },
  'fred':    { 'age': 40, 'active': false },
  'pebbles': { 'age': 1,  'active': true }
};

_.findKey(users, { 'age': 1, 'active': true });
// → 'pebbles'


답변

function extractKeyValue(obj, value) {
    return Object.keys(obj)[Object.values(obj).indexOf(value)];
}

컴파일 후 알 수없는 키 이름을 추출하기 위해 클로저 컴파일러를 위해 제작되었습니다.

더 섹시한 버전이지만 미래를 사용 Object.entries 기능 사용

function objectKeyByValue (obj, val) {
  return Object.entries(obj).find(i => i[1] === val);
}


답변

ES6 + 원 라이너

let key = Object.keys(obj).find(k=>obj[k]===value);

값이있는 모든 키를 반환하십시오.

let keys = Object.keys(obj).filter(k=>obj[k]===value);