我发现自己正在努力解决一个小问题。 假设我有一个对象:
var foo = {
bar: {
baz: true
}
};
现在我还有一个字符串'foo.bar.baz'
。我现在想要使用字符串从对象中检索值。
请注意:这只是一个例子,解决方案需要是动态的。
更新
我还需要变量名称是动态的,并从字符串中解析。此外,我无法确定我的变量是窗口的属性。
我已经使用eval
构建了一个解决方案,但我认为这非常难看:
http://jsfiddle.net/vvzyX/
答案 0 :(得分:4)
例如,
function get(obj, path) {
return path.split('.').reduce(function(obj, p) {
return obj[p]
}, obj);
}
演示:
tree = {
foo: {
bar: 1,
baz: { quux: 3 },
},
spam: 1
}
console.log(get(tree, 'foo.baz.quux')) // 3
答案 1 :(得分:2)
以下是如何执行此操作的方法:
function getValue(namespace, parent) {
var parts = namespace.split('.'),
current = parent || window;
for (var i = 0; i < parts.length; i += 1) {
if (current[parts[i]]) {
current = current[parts[i]];
} else {
if (i >= parts.length - 1)
return undefined;
}
}
return current;
}
var foo = {
bar: {
baz: true
}
};
console.log(getValue('foo.bar.baz')); //true
该函数的第一个参数是命名空间(点分隔值),第二个参数是parent
对象,如果未提供父对象,则使用window
。
使用父参数的另一个例子:
var str = 'foo.bar.baz';
foo = {
bar: {
baz: true
}
};
result = getValue(str, foo);
console.log(result);
以下是jsfiddle中的示例。
YUI中使用了类似的方法。他们的方法称为命名空间模式。主要好处是模拟包/命名空间。此脚本与命名空间模式之间的唯一区别是命名空间函数创建嵌套结构而不是仅返回值。
答案 2 :(得分:2)
试试这个:
var name = [window].concat('foo.bar.baz'.split('.')).reduce(function(prev, curr) {
return prev[curr];
});
console.log(name);
// -> 'true'
答案 3 :(得分:0)
我能想到的是使用字符串拆分将该字符串首先拆分为数组,并通过[]
访问该对象以使用循环访问该对象的属性