Как получить ключ в объекте JavaScript по его значению? - PullRequest
283 голосов
/ 28 марта 2012

У меня есть довольно простой объект JavaScript, который я использую в качестве ассоциативного массива. Существует ли простая функция, позволяющая мне получить ключ для значения, или мне нужно выполнить итерацию объекта и найти его вручную?

Ответы [ 23 ]

391 голосов
/ 28 января 2015
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"));
169 голосов
/ 28 марта 2012

Стандартный метод недоступен. Вам нужно повторить, и вы можете создать простой помощник:

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 и вместо этого передать в нее объект.

96 голосов
/ 26 августа 2013

с Underscore.js библиотека:

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

(_.invert(hash))[1]; // => 'foo'
95 голосов
/ 28 марта 2012

Как сказано, итерация необходима. Например, в современном браузере вы могли бы иметь:

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

Где value содержит значение, которое вы ищете. Сказал, что я, вероятно, использовал бы цикл.

В противном случае вы можете использовать правильный объект "hashmap" - есть несколько реализаций в JS - или реализовать его самостоятельно.

ОБНОВЛЕНИЕ 2018

Прошло шесть лет, но я все еще имею право голоса здесь, поэтому я чувствую, что более современное решение - для современного браузера / среды - следует упомянуть в самом ответе, а не только в комментариях:

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

Конечно, это может быть и функция:

const getKeyByValue = (obj, value) => 
        Object.keys(obj).find(key => obj[key] === value);
40 голосов
/ 20 марта 2016

Путь Лодаша 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'
31 голосов
/ 19 апреля 2016
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);
}
21 голосов
/ 03 августа 2012

Я использую эту функцию:

Object.prototype.getKey = function(value){
  for(var key in this){
    if(this[key] == value){
      return key;
    }
  }
  return null;
};

Использование:

// ISO 639: 2-letter codes
var languageCodes = {
  DA: 'Danish',
  DE: 'German',
  DZ: 'Bhutani',
  EL: 'Greek',
  EN: 'English',
  EO: 'Esperanto',
  ES: 'Spanish'
};

var key = languageCodes.getKey('Greek');
console.log(key); // EL
16 голосов
/ 13 декабря 2015

Держите ваш прототип в чистоте.

function val2key(val,array){
    for (var key in array) {
        if(array[key] == val){
            return key;
        }
    }
 return false;
}

Пример:

var map = {"first" : 1, "second" : 2};
var key = val2key(2,map); /*returns "second"*/
14 голосов
/ 13 марта 2017

Не повторяемое решение

Основная функция:

var keyByValue = function(value) {

    var kArray = Object.keys(greetings);        // Creating array of keys
    var vArray = Object.values(greetings);      // Creating array of values
    var vIndex = vArray.indexOf(value);         // Finding value index 

    return kArray[vIndex];                      // Returning key by value index
}

Объект с ключами и значениями:

var greetings = {
    english   : "hello",
    ukranian  : "привіт"
};

Тест:

keyByValue("привіт");
// => "ukranian"
14 голосов
/ 04 августа 2015

Если вы работаете с библиотекой Underscore или Lodash , вы можете использовать функцию _. FindKey :

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

_.findKey(users, function(o) { return o.age < 40; });
// => 'barney' (iteration order is not guaranteed)

// The `_.matches` iteratee shorthand.
_.findKey(users, { 'age': 1, 'active': true });
// => 'pebbles'

// The `_.matchesProperty` iteratee shorthand.
_.findKey(users, ['active', false]);
// => 'fred'

// The `_.property` iteratee shorthand.
_.findKey(users, 'active');
// => 'barney'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...