JavaScript - найти ключ зная его значение

445
24 июня 2017, 14:12

Надо найти в объекте ключ, зная только его значение. Я написал код, но он не находит ключи находящиеся в под-объекте. Вот сам код:

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

Первый пример (работает корректно):

Object.prototype.getKeyByValue = function(value) { 
  for (var prop in this) { 
    if (this.hasOwnProperty(prop)) { 
      if (this[prop] === value) 
        return prop; 
    } 
  } 
} 
 
var foobar = { 
  foo: 4, 
  bar: 7 
} 
document.write(foobar.getKeyByValue(7));

Второй пример (работает не корректно):

Object.prototype.getKeyByValue = function(value) { 
  for (var prop in this) { 
    if (this.hasOwnProperty(prop)) { 
      if (this[prop] === value) 
        return prop; 
    } 
  } 
} 
 
var foobar = { 
  foo: 4, 
  bar: { 
    baz: 7 
  } 
} 
document.write(foobar.getKeyByValue(7));

Почему во втором примере не находит значение и как это исправить?

Answer 1

Потому что для поиска вглубь нужна рекурсия.

Object.prototype.getKeyByValue = function(value, objs) { 
 
  // защита от циклических ссылок 
  if (!objs) 
    objs = []; 
 
  for (var prop in this) { 
    if (this.hasOwnProperty(prop)) { 
      if (this[prop] === value) { 
        return prop; 
      } else if (typeof this[prop] === "object" && objs.indexOf(this[prop]) == -1) { 
        objs.push(this[prop]); 
        var res = this[prop].getKeyByValue(value, objs); 
        if (res) 
          return prop + "." + res; //за дополнительные баллы оценки - выведем цепочку названий ключей 
      } 
    } 
  } 
} 
 
var foobar = { 
  foo: 4, 
  bar: { 
    baz: 7 
  } 
} 
console.log(foobar.getKeyByValue(7));

READ ALSO
Cordova + Webpack + Hot Module Replacement (HMR) как настроить для разработки?

Cordova + Webpack + Hot Module Replacement (HMR) как настроить для разработки?

Как настроить проект для разработки приложений под Codova, с использованием вебпака, да еще и с горячей заменой модулей HMRЧтобы при изменении...

441
chrome extension не работает xhr

chrome extension не работает xhr

Пытаюсь в injectjs вызвать xhr get запрос на другой сайт, но в ответ получаю :

517
Перебор массива каждые 3 элемента

Перебор массива каждые 3 элемента

Приветствую! Подскажите пожалуйста, как можно перебирать массив каждые 3 элементаУ меня есть массив var arr = [[1, 2, 3, 4, 5, 6, 7, 8, 9]] Мне нужно через...

418