Javascript:从对象获取深层值通过传递path为string

可能重复:
使用string键访问嵌套的JavaScript对象

也许标题不够清楚,我只是不知道如何指定我在找什么,而我的英语真的很糟糕,对不起。

我试图创build返回对象值的函数,但也适合嵌套对象。 例如:

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

我想通过向函数提供string“foo.bar”来访问obj.foo.bar的值。

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

谢谢!

考虑这个:

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

这工作正常:

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

这是certificate/演示: jsfiddle.net/tadeck/5Pt2q/13/

编辑:我已经删除了多余的variables,缩短了代码。

你的意思是这样吗? 这是一个recursion的版本

 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/

就像是:

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

你想要在string上分割string,然后重复索引到对象中,例如:

 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 )的虚线语法,使用string( obj["foo"] )的括号语法。 在后一种情况下,string可以是任何expression式的结果,它不一定是string文字。 在所有的中, 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"];