@drwhite87

Как достать значение объекта?

Здравствуйте.
Как достать значение объекта не зная заранее уровень вложенности?
Например есть объект
r = {
    foo: {
        bar: 'value'
    },
    foo2: 'value2'
}


Нам дается переменная Y = 'foo2' и Z = 'foo.bar'. Достать из объекта значение r.foo2 просто - r[Y], а как достать r.foo.bar используя переменную Z?

Спасибо.
  • Вопрос задан
  • 237 просмотров
Решения вопроса 3
0xD34F
@0xD34F Куратор тега JavaScript
var
  path = 'aaa.bbb.ccc.ddd',
  data = {
    aaa: {
      bbb: {
        ccc: {
          ddd: 'Hello!!'
        }
      }
    }
  };

console.log(path.split('.').reduce((p, c) => p[c], data)); // Hello!!
Ответ написан
sergiks
@sergiks Куратор тега JavaScript
♬♬
Вариант в лоб, плохой:
function bad( obj, name) {
  return eval('obj.' + name);     
}
bad(r, 'foo.bar'); // 'value'


Вариант чуть получше, проверяем на каждом шаге, есть ли такое свойство:
function better( obj, name) {
  var parts = name.split('.'), i, cursor = r;
  
  for( i = 0; i < parts.length; i++) {
    if( !cursor.hasOwnProperty( parts[i])) throw('No such property: ' + parts[i]);
    cursor = cursor[parts[i]];
  }
  
  return cursor;
}

better(r, 'foo.bar'); // 'value'
Ответ написан
Комментировать
mlnkv
@mlnkv
JavaScript Developer
var data = { 
  a: { 
    b: { 
      c: { 
        d: { 
          e: "Hello World!" 
        } 
      } 
    } 
  } 
}
function from(target, path) {
  return path.split(".").reduce(function(data, key) { 
    return data && data[key] 
  }, target)
}
console.log(from(data, "a.b.c.d.e")) // "Hello World!"
console.log(from(data, "a.a.a.a.a")) // undefined
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
alexandzolotarev
@alexandzolotarev
Пишем функцию которая будет перебирать объект и в случае если значение ключа объекта принимает объект сама себя вызывает, и так пока не найдёт нужный ключ. https://learn.javascript.ru/recursion
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы