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(".")); }
就像是:
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"];