Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

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

#javascript #ооп


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

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));




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


Ответы

Ответ 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));

Комментариев нет:

Отправить комментарий