Javascript: Obtenha valor profundo do object passando caminho para ele como string

Duplicar Possível:
Acessando Objetos JavaScript Aninhados com Chave de Cadeia

Talvez o título não seja claro o suficiente, eu só não sabia como especificar o que estou procurando e meu inglês é muito ruim, desculpe.

Eu estou tentando criar function que retorna o valor do object, mas também joga legal com objects nesteds. Por exemplo:

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

Eu quero acessar o valor de obj.foo.bar, fornecendo a string “foo.bar” para a function.

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

Obrigado!

Considere isto:

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

Isso funciona corretamente:

 var deep_value = function(obj, path){ for (var i=0, path=path.split('.'), len=path.length; i 

Aqui está a prova / demo: jsfiddle.net/tadeck/5Pt2q/13/

EDIT: eu removi variables ​​redundantes, encurtou o código.

Você quer dizer algo assim? É uma versão recursiva

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

Veja http://jsfiddle.net/kExSr/

algo como:

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

Você deseja dividir a string no ponto e, em seguida, indexar repetidamente no object, por exemplo, ao longo das linhas de:

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

Exemplo ao vivo

Isso funciona porque você pode acessar a propriedade de um object de duas maneiras diferentes: Há uma syntax pontilhada usando um literal ( obj.foo ) e há uma syntax entre colchetes usando uma string ( obj["foo"] ). No último caso, a string pode ser o resultado de qualquer expressão, não precisa ser uma string literal. Em todos os, rv é definido para o mesmo valor:

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