Надо найти в объекте ключ, зная только его значение. Я написал код, но он не находит ключи находящиеся в под-объекте. Вот сам код:
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));
Почему во втором примере не находит значение и как это исправить?
Ответ
Потому что для поиска вглубь нужна рекурсия.
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));
Комментариев нет:
Отправить комментарий