Javascript: получить глубокое значение от объекта, пройдя путь к нему как строку

Возможный дубликат:
Доступ к вложенным объектам JavaScript со строковым ключом

Возможно, заголовок недостаточно ясен, я просто не знал, как указать, что я ищу, и мой английский действительно плохой, извините.

Я пытаюсь создать функцию, возвращающую значение объекта, но также хорошо играет с вложенными объектами. Например:

var obj = {
  foo: { bar: 'baz' }
};

Я хочу получить доступ к значению obj.foo.bar, добавив в функцию строку "foo.bar".

function(obj, path) {
  // Path can be "foo.bar", or just "foo".
}

Спасибо!

Ответы

Ответ 1

Рассмотрим это:

var obj = {
  foo: { bar: 'baz' }
};

function deepFind(obj, path) {
  var paths = path.split('.')
    , current = obj
    , i;

  for (i = 0; i < paths.length; ++i) {
    if (current[paths[i]] == undefined) {
      return undefined;
    } else {
      current = current[paths[i]];
    }
  }
  return current;
}

console.log(deepFind(obj, 'foo.bar'))

Ответ 2

Это работает правильно:

var deep_value = function(obj, path){
    for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
        obj = obj[path[i]];
    };
    return obj;
};

Вот доказательство /demo: jsfiddle.net/tadeck/5Pt2q/13/

EDIT: я удалил избыточные переменные, сократил код.

Ответ 3

Ты имеешь в виду что-то вроде этого? Это рекурсивная версия

function recLookup(obj, path) {
    parts = path.split(".");
    if (parts.length==1){
        return obj[parts[0]];
    }
    return recLookup(obj[parts[0]], parts.slice(1).join("."));
}

См. http://jsfiddle.net/kExSr/

Ответ 4

что-то вроде:

function(obj, path) {
  var current=obj; 
  path.split('.').forEach(function(p){ current = current[p]; }); 
  return current;
}

Ответ 5

Вы хотите разбить строку на точку и затем повторно индексировать объект, например. вдоль линий:

function goDeep(obj, path) {
    var parts = path.split('.'),
        rv,
        index;
    for (rv = obj, index = 0; rv && index < parts.length; ++index) {
        rv = rv[parts[index]];
    }
    return rv;
}

Живой пример

Это работает, потому что вы можете получить доступ к свойству объекта несколькими способами: там пунктирный синтаксис с использованием литерала (obj.foo) и синтаксис в квадратных скобках с использованием строки (obj["foo"]). В последнем случае строка может быть результатом любого выражения, она не должна быть строковым литералом. In во всех параметрах rv установлено равное значение:

rv = obj.foo.bar;
// Or
rv = obj.foo["bar"];
// Or
f = "foo";
rv = obj[f].bar;
// Or
s = "b";
rv = obj.foo[s + "ar"];