#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));
Комментариев нет:
Отправить комментарий