也许标题不够明确,我只是不知道如何指定我正在寻找的东西而且我的英语非常糟糕,抱歉。
我正在尝试创建返回对象值的函数,但也可以使用嵌套对象。例如:
var obj = {
foo: { bar: 'baz' }
};
我想通过将字符串“foo.bar”提供给函数来访问obj.foo.bar的值。
function(obj, path) {
// Path can be "foo.bar", or just "foo".
}
谢谢!
答案 0 :(得分:73)
这是正常的:
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;
};
以下是证明/演示:jsfiddle.net/tadeck/5Pt2q/13/
编辑:我删除了冗余变量,缩短了代码。
答案 1 :(得分:40)
考虑一下:
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 :(得分:8)
你的意思是这样的?它是一个递归版本
function recLookup(obj, path) {
parts = path.split(".");
if (parts.length==1){
return obj[parts[0]];
}
return recLookup(obj[parts[0]], parts.slice(1).join("."));
}
答案 3 :(得分:6)
类似的东西:
function(obj, path) {
var current=obj;
path.split('.').forEach(function(p){ current = current[p]; });
return current;
}
答案 4 :(得分:4)
你想要在点上分割字符串,然后重复索引到对象,例如沿着这条线:
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"]
)括起来的语法。在后一种情况下,字符串可以是任何表达式的结果,它不必是字符串文字。在所有这些中,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"];